std::vector
имеет возможность динамически изменять размер по вашему желанию. Как всегда, гибкость имеет цену. Обычно эта цена невелика и может быть легко проигнорирована, хотя в этом случае, когда вы используете std::vector<float>
против std::array<float,3>
, разница очень значительна, поскольку у вас есть 100 миллионов элементов. Например, если мы запустим этот код:
std::vector<float> v;
for( auto f : { 1.0, 2.0, 3.0 } ) v.push_back(f);
std::cout << sizeof(v) << "-" << v.capacity() << std::endl;
std::cout << sizeof(std::array<float,3>) << std::endl;
живой пример
мы видим, что на этой платформе std::vector<float>
сама занимает 24 байта, плюс она динамически распределяет память для 4-х операций с плавающей запятой - 16 байт против всего 3 операций с плавающей запятой - 12 байт, если вы используете структуру фиксированного размера. Так что в вашем случае разница будет:
1 std::vector - ( 24 + 16 ) * 100 000 000 = 4 000 000 000
2 std::array - 12 * 100 000 000 = 1 200 000 000
2 800 000 000 или около 2 ГБ памяти.
Но это еще не все std::vector
имеет другую цену - он должен размещать все данные в непрерывном пространстве. Обычно это делается перераспределением емкости, когда размер достигает текущего. В этом случае это означает, что потребность в памяти для создания этих данных может быть легко увеличена более чем вдвое - скажем, если емкость достигает 50 миллионов, а вектор нужно перераспределить, это создаст еще один блок памяти, скажем, 100 миллионов при сохранении предыдущего (так Ваша память должна содержать 150 миллионов элементов) и скопировать их. И это без проблемы фрагментации памяти.
Поэтому рекомендуемое решение - иметь std::array<float,3>
для внутренних данных (или struct
с 3 элементами) и либо std::deque
в качестве внешнего контейнера, либо, если вам нужно использовать std::vector
, выделите память для достаточного количества элементов заранее.