Как эффективно копировать из gsl::span в std::vector? ⇐ C++
-
Anonymous
Как эффективно копировать из gsl::span в std::vector?
Чтобы скопировать из C++20 std::span в std::vector, я могу просто сделать следующее:
void WriteBuffer(std::vector& destData, const std::span& srcData) { std::copy(srcData.begin(), srcData.end(), destData.end()); } ..который будет оптимизирован до одного memmove. См. пример: https://godbolt.org/z/8nPjzj3c6
Однако, если я заменю std::span на gsl::span, мы больше не получим эту оптимизацию: https://godbolt.org/z/ MWfPKW8eq
Лучше ли вместо этого изменить размер вектора и использовать std::memcpy для копирования данных или есть лучшие альтернативы?
Насколько я понимаю, gsl::span не оптимизируется, поскольку он использует собственный итератор, о котором реализация std::copy не знает, поэтому он не может делать предположения о линейности данных - верно? Если да, то я предполагаю, что все контейнеры и алгоритмы STL будут иметь одну и ту же проблему с gsl::span и любыми другими структурами данных, использующими собственные итераторы. Но, пожалуйста, дайте мне знать, если я что-то неправильно понял.
Чтобы скопировать из C++20 std::span в std::vector, я могу просто сделать следующее:
void WriteBuffer(std::vector& destData, const std::span& srcData) { std::copy(srcData.begin(), srcData.end(), destData.end()); } ..который будет оптимизирован до одного memmove. См. пример: https://godbolt.org/z/8nPjzj3c6
Однако, если я заменю std::span на gsl::span, мы больше не получим эту оптимизацию: https://godbolt.org/z/ MWfPKW8eq
Лучше ли вместо этого изменить размер вектора и использовать std::memcpy для копирования данных или есть лучшие альтернативы?
Насколько я понимаю, gsl::span не оптимизируется, поскольку он использует собственный итератор, о котором реализация std::copy не знает, поэтому он не может делать предположения о линейности данных - верно? Если да, то я предполагаю, что все контейнеры и алгоритмы STL будут иметь одну и ту же проблему с gsl::span и любыми другими структурами данных, использующими собственные итераторы. Но, пожалуйста, дайте мне знать, если я что-то неправильно понял.
Мобильная версия