Я запускаю очень чувствительный ко времени код, и мне нужна схема, чтобы зарезервировать больше места для моих векторов в определенном месте кода, где я могу знать (приблизительно), сколько элементов будет добавлено, вместо того, чтобы std делал это за меня когда вектор заполнен.
Я не нашел способа проверить это, чтобы убедиться, что нет угловых случаев std, о которых я не знаю, поэтому мне интересно, как емкость вектора влияет на перераспределение памяти. В частности, будет ли приведенный ниже код гарантировать, что автоматическое перераспределение никогда не произойдет?
код
std::vector<unsigned int> data;
while (condition) {
// Reallocate here
// get_elements_required() gives an estimate that is guaranteed to be >= the actual nmber of elements.
unsigned int estimated_elements_required = get_elements_required(...);
if ((data.capacity() - data.size()) <= estimated_elements_required) {
data.reserve(min(data.capacity() * 2, data.max_length - 1));
}
...
// NEVER reallocate here, I would rather see the program crash actually...
for (unsigned int i = 0; i < get_elements_to_add(data); ++i) {
data.push_back(elements[i]);
}
}
estimated_elements_required
в приведенном выше коде — это оценка, которая гарантированно равна или превышает фактическое количество элементов, которые будут добавлены. Код, фактически добавляющий элементы, выполняет операции, основанные на емкости самого вектора, изменение емкости на полпути приведет к неверным результатам.
resize(()
вместоreserve()
. - person πάντα ῥεῖ   schedule 26.04.2014data.reserve(elements_required);
, потому что.... ? Или вы имели в виду, чтоelements_required
на самом деле являетсяelements_to_add
(источник которого в этом коде является загадкой)? - person WhozCraig   schedule 26.04.2014reserve
осторожно, чтобы точно контролировать выделение памяти. Он гарантированно не будет выделен, если вы не добавите больше текущегоcapacity
. - person M.M   schedule 26.04.2014elements_to_add
связано сelements_required
,data.size()
иdata.capacity()*2
в вашем коде? - person MikeMB   schedule 26.04.2014