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, добавленных непосредственно в выделенный где-либо вектор без перераспределения памяти для строк?
Вы можете написать свой код с настраиваемым распределителем, который регистрирует свои операции и убедитесь сами! –
Назовите: одним словом, «да». –
Даже с семантикой перемещения строка назначения еще должна быть инициализирована. Таким образом, вы инициализируете две строки против инициализации одной строки. Как вы думаете? –