2010-05-03 2 views
1

От a previous question about vector capacity, г-н Бейли сказал:C++ станд :: вектор памяти/распределение

В текущем C++ вы гарантированно что не Перераспределение не происходит после того, как вызов для резервирования, пока вставки не будет принимать размер за пределы значения предыдущего вызова в резерв. Перед вызовом резервирования или после вызова, чтобы зарезервировать, когда размер находится между значением предыдущего вызова для резервирования и пропускной способностью, реализация может быть перераспределена раньше, если она этого захочет.

Итак, если я правильно понял, чтобы гарантировать, что перераспределение не произойдет до превышения емкости, я должен сделать резерв дважды? Не могли бы вы прояснить это?

Я использую вектор в качестве стека памяти, как это:

std::vector<double> memory; 
memory.reserve(size); 
memory.insert(memory.end(), matrix.data().begin(), matrix.data().end()); // smaller than size 
memory.resize(memory.capacity(), 0); 

Мне нужно, чтобы гарантировать, что перераспределение не происходит в приведенном выше.

спасибо.

пс: Я также хотел бы знать, если есть лучший способ управления стек памяти подобным образом, кроме вектора

ответ

4

Я думаю, что вы читаете это утверждение неправильно. Резерв имеет право установить capacity на большее количество, чем вы зарезервировали. Специальный язык должен позволить перераспределению реализации, если вы резервируете больше, чем вы делали в последний раз, но до того, как вы достигли текущей емкости.

+0

хорошо, спасибо. Я не англоговорящий, и это предложение несколько сбивало с толку мне – Anycorn

+0

@ Марк, я не считаю эту запись очень ясной. 23.3.6.2.2 C++ 0X FCD более ясен: Эффекты: директива, которая информирует вектор о планируемом изменении размера, чтобы он мог соответственно управлять распределением хранилища . После резерва() емкость() больше или равна аргументу резерва, если происходит перераспределение ; и равным предыдущему значению емкости() в противном случае. Перераспределение происходит в этой точке тогда и только тогда, когда текущая емкость меньше аргумента reserve(). Если исключение выбрано иначе, чем конструктор перемещения типа, не являющегося CopyConstructible, эффектов нет. –

0

Он перераспределяет, когда он нуждается в большем количестве. Вам не нужно резервировать дважды. Рекомендуется использовать резерв, если вы много вкладываете, и у вас есть хорошее знание размера того, что вы храните. Это намного быстрее.

0

Вам не нужно звонить в номер reserve дважды.

Кроме того, в приведенном примере кода вы только один раз назовете reserve. В действительности код, который вы вставляете, влияет на вектор size. См 23.3.6.2.11 (C++ 0x FCD) на эффектах void resize(size_type sz, const T& c);:

if (sz > size()) 
    insert(end(), sz-size(), c); 
else if (sz < size()) 
    erase(begin()+sz, end()); 
else 
    ; // do nothing 

Таким образом, в основном, когда вы звоните memory.resize(memory.capacity(), 0), вы, по сути, добавление в 0, memory.capacity() - memory.size() раз после вашего вызова memory.insert.

+0

, который является намеренным. Мне требуется некоторая нулевая память – Anycorn

Смежные вопросы