Следующая функция принимает строку в качестве аргумента и возвращает другую после некоторой обработки.
Достаточно ли справедливо предположить, что компилятор выполнит оптимизацию перемещения, и я не буду в конечном итоге копировать содержимое строки после каждого вызова? Должна ли эта функция следовать копия elision [(N), РВО]?
На практике это целесообразно?
std::string foo(std::string const& s)
{ // Perform sanity check on s
// ...
std::stringstream ss;
// do something and store in ss
// ...
return ss.str();
}
Потому что, в противном случае, я обычно следую практике возврата строк по ссылке. Итак, моя функция подписи была бы:
void foo (std::string const& inValue, std::string& outValue);
ss.str()
создаст временную строку. Если вы присваиваете эту строку новому экземпляру, например,
std::string bar = foo("something");
Сработает либо семантика перебора копий, либо перемещение.
Теперь, если у вас уже есть созданная строка, и вы назначаете ее для возврата foo
тогда сдвинуться с места
std::string bar;
// do stuff
bar = foo("something");
Я предпочитаю этот метод, так как он не требует наличия уже созданного объекта, где
void foo (std::string const& inValue, std::string& outValue);
Вы бы создали пустую строку только для того, чтобы передать ее функции для заполнения. Это означает, что у вас есть конструкция и задание, где в первом примере вы можете просто получить конструкцию.
В соответствии с этот это более оптимизировано, когда вы возвращаете значение:
Оптимизация возвращаемого значения (RVO) позволяет компилятору оптимизировать удаление копии, когда вызывающая сторона и вызываемая сторона используют одинаковый кусок памяти для обеих «копий».