Если в моем коде я объявил переменную (например, строку) и хочу перейти к какой-либо функции, чтобы мой вектор добавил это значение. Всегда ли мне нужно это делать (используя std :: move), учитывая, что мне больше не нужна эта переданная переменная?

Void add(string s){
    my_vector.push_back(move(s));
}

Я знаю, что могу просто передать rvalue, но подумайте, нужно ли мне сначала объявить строку (сделав ее rvalue), а затем добавить ее в вектор.

Потому что я не хочу копировать переменную, а затем возвращаться к моему вектору

2
user4222907 2 Янв 2018 в 12:11

2 ответа

Лучший ответ

Если вы хотите, чтобы строка была перемещена, вы должны это сказать. В противном случае он будет скопирован.

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

В частности, для std::string в основных реализациях используется Оптимизация малых строк, при которой короткие строки (обычно 10–20 байтов) будут храниться внутри строкового объекта, чтобы сэкономить на выделении кучи. В этом случае перемещение и копирование будут делать то же самое для коротких строк.

1
Bo Persson 2 Янв 2018 в 09:28

В зависимости от того, что вы собираетесь делать со своим методом add и как вы планируете его использовать, вам следует рассмотреть возможность использования универсальной ссылки: вы объявляете аргумент s как ссылку rvalue, а затем:

  • если вызывающий аргумент является lvalue, s будет ссылкой на lvalue;
  • если вызывающий аргумент является rvalue, s будет ссылкой на rvalue.

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

void add(string && s) {
    my_vector.push_back(s);
}
0
Xavier Lamorlette 2 Янв 2018 в 09:47