Как эффективно копировать из gsl::span в std::vector?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как эффективно копировать из gsl::span в std::vector?

Сообщение Anonymous »


Чтобы скопировать из 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 и любыми другими структурами данных, использующими собственные итераторы. Но, пожалуйста, дайте мне знать, если я что-то неправильно понял.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»