Преобразование типа вектора из uint8 в uint16

Есть вектор std::vector<uint8_t> From;
Он содержит 10^9 элементов

И есть пустой вектор std::vector<uint16_t> To;
В который нужно перенести значения так, чтобы значения элементов остались прежними.

Как грамотно это сделать?


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy
To.assign(From.begin(), From.end());

Да, это просто копирование. Хороший компилятор вычислит размер вектора From, выделит память и скопирует данные.

Сколько понадобится памяти? Давайте обозначим объём вектора To за единицу. Тогда объём вектора From будет в два раза больше - две единицы. Так как мы копируем, то на время копирования нам понадобятся три единицы памяти.

Можно ли преобразовать To во From в меньшей памяти? Нет, так как мы хотим чтобы From был вектором.

Вектор умеет распределять память только одним способом - запрашивая непрерывный блок памяти из кучи. Этот блок в момент запроса не может содержать данные - технологии типа realloc не используются вектором (почему - отдельный интересный вопрос). Так как данных в этом блоке нет, значит они где-то ещё и занимают одну единицу памяти. То есть в момент распределения памяти для вектора нам нужны три единицы памяти: одна для данных, две для нового вектора.

И общий рецепт - если памяти мало, не используйте вектора. Непрерывный блок памяти сравнимый с размерами памяти - зло.

→ Ссылка