Как добавить необработанные байты в std :: vector? - PullRequest
2 голосов
/ 11 февраля 2020

Я хочу добавить необработанные байты в vector следующим образом.

vector.reserve(current_size + append_data_size);
memcpy(append_data, vector.data() + current_size, append_data_size);
vector.resize(current_size  + append_data_size) // Expect only set size to current_size + append_data_size.

медленнее ниже? потому что я думаю, что вектор инициализируется по умолчанию сначала, а затем установить данные, которые являются ненужными.

vector.resize(current_size  + append_data_size);
memcpy(append_data, vector.data() + current_size, append_data_size);

Ответы [ 2 ]

7 голосов
/ 11 февраля 2020

Изменение векторного хранилища сверх его размера - неопределенное поведение, и последующее resize инициализирует новые элементы в конце хранилища.

Однако вместо этого можно использовать insert:

vector.insert(vector.end(), bytes, bytes + size);
5 голосов
/ 11 февраля 2020

Даже если вы вызываете reserve, вы все равно должны вызвать resize для вектора, если вы хотите получить доступ к новым элементам, в противном случае поведение вашего кода будет undefined . То, что reserve может сделать, это сделать push_back и другие подобные операции более эффективными.

Лично я не буду беспокоиться о таких оптимизациях, если вы не докажете, что они оказывают влияние на соответствующий инструмент профилирования. Чаще всего тратить время на std::vector бессмысленно.

Также использование memcpy опасно. (Конструкторы копирования не будут вызываться, например, знание точного поведения копирования отступов в структурах с memcpy, например, является верным способом повысить вашу репутацию на этом сайте!) Вместо этого используйте insert и доверьте компилятору оптимизацию при необходимости.

Без явного дополнительного параметра std :: vector :: resize value-инициализирует любые дополнительные члены. Неформально это означает, что элементы, скажем, std::vector из T установлены на значения так же, как t в static T t;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...