Резервирующая емкость требует двух распределений или только одного? - PullRequest
4 голосов
/ 01 мая 2010
std::vector<T> vec;   // line #1
vec.reserve(100);     // line #2

Мне интересно, запускает ли строка # 1 небольшое выделение (скажем, память на 10 Ts) или первое выделение происходит в строке # 2. Стандарт говорит что-нибудь об этом?

Ответы [ 3 ]

7 голосов
/ 01 мая 2010

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

2 голосов
/ 01 мая 2010

Стандарт не говорит, но вы можете сами узнать, что у вас в системе:

vector<int> v;
cout << v.capacity() << endl;
v.reserve(100);
cout << v.capacity() << endl;

Это дает мне 0 и 100 на VS2008 - т.е. начальный вектор ничего не выделил.

РЕДАКТИРОВАТЬ: удалены ошибочные советы.
EDIT2: маленький эксперимент, потому что мне было любопытно ...

vector<int> w;
for (int i=0; i<100000; i++)
{
    if (i == w.capacity())
        cout << i << ", ";
    w.push_back(i);
}

Выход:

0, 1, 2, 3, 4, 6, 9, 13, 19, 28, 42, 63, 94, 141, 211, 316, 474, 711, 1066, 
1599, 2398, 3597, 5395, 8092, 12138, 18207, 27310, 40965, 61447, 92170,
0 голосов
/ 01 мая 2010

Первый тип обычно не инициирует выделение, кроме пространства для векторного контейнера в стеке (которое будет включать информацию о том, сколько места было выделено и сколько используется, что будет равно нулю). Но распределение кучи не происходит, пока вы не зарезервируете. ... обычно.

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