Оптимизация компилятора с возвратом (std :: stringstream ss) .str ()

Следующая функция принимает строку в качестве аргумента и возвращает другую после некоторой обработки.

  1. Достаточно ли справедливо предположить, что компилятор выполнит оптимизацию перемещения, и я не буду в конечном итоге копировать содержимое строки после каждого вызова? Должна ли эта функция следовать копия elision [(N), РВО]?

  2. На практике это целесообразно?

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);

0

Решение

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);

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

1

Другие решения

В соответствии с этот это более оптимизировано, когда вы возвращаете значение:

Оптимизация возвращаемого значения (RVO) позволяет компилятору оптимизировать удаление копии, когда вызывающая сторона и вызываемая сторона используют одинаковый кусок памяти для обеих «копий».

0

По вопросам рекламы [email protected]