2016-02-03 1 views
2
std::vector<std::string> v; 
v.push_back(""); 
v[0] += 's'; 
v[0] += 't'; 
v[0] += 'r'; 
v.push_back(""); 
v[1] += 's'; 
v[1] += 't'; 
v[1] += 'r'; 

иЯвляется ли память эффективной, чтобы сначала создать строку, а затем добавить ее в вектор через семантику перемещения или создать элемент в векторе?

std::vector<std::string> v; 
std::string s = ""; 
s += 's'; 
s += 't'; 
s += 'r'; 
std::string s1 = s; 
v.push_back(std::move(s)); 
v.push_back(std::move(s1)); 

В первом случае мы сначала создать элемент в векторе, а затем изменить его. Я предполагаю, что в таком маленьком случае на первом месте будет достаточно памяти, но если это не так, будет вектор v, смежный в памяти, или просто указатели на строковые объекты? Добавляет ли элемент элемент строки в вектор, чтобы последний выполнял перераспределение памяти?

Во втором случае будет выделена память для строк, используемых как rvalue, добавленных непосредственно в выделенный где-либо вектор без перераспределения памяти для строк?

+0

Вы можете написать свой код с настраиваемым распределителем, который регистрирует свои операции и убедитесь сами! –

+0

Назовите: одним словом, «да». –

+0

Даже с семантикой перемещения строка назначения еще должна быть инициализирована. Таким образом, вы инициализируете две строки против инициализации одной строки. Как вы думаете? –

ответ

1

std::vector всегда хранит данные в непрерывном блоке памяти.
В обоих случаях, если string s Вы хотите оттолкнуть назад, не можете поместиться в
уже выделенной памяти, произойдет перераспределение.

Поступая v.push_back(std::move(s)) данные будут перемещены в std::string в vector
от s, поэтому неиспользованная копия данных s «s не будет оставаться в памяти.
Это может быть более эффективным для большого объема данных, но в вашем случае это
не имеет большого значения.

Во втором случае Вы также должны инициализировать еще два string сек ...

+3

Очень важно отметить, что только строковые объекты хранятся смежно в векторе, а не в куче памяти, используемой для фактических строковых данных. (Конечно, короткие оптимизации строк, которые хранят короткие строки внутри, чтобы избежать кучи для коротких строк, хотя) –

+0

@ ErikAlapää true –