Может ли компилятор C ++ выполнить RVO для const возвращаемого значения?

Допустим, у меня есть функция

#include <string>

std::string const foo()
{
std::string s = "bar";
return s;
}

int main()
{
std::string t = foo();
}

Может ли компилятор выполнить (именованную) оптимизацию возвращаемого значения для tхотя типы s а также t оба отличаются от возвращаемого типа foo из-за constразница?

(Если ответ для C ++ 03 и C ++ 11 разный, то мне определенно интересно узнать ответ C ++ 03.)

7

Решение

Для оптимизации RVO нет возможности нарушить обещание const, так что нет проблем: RVO может быть выполнен.


Тем не мение, переместить семантику зависит от const, Это эффективно отключает семантику перемещения, то есть вызовы T(T&&) конструктор или оператор присваивания перемещения. Так что в общем, не используйте const на возвращаемое значение.

Скотт Мейерс изначально рекомендовал const на возвращаемые значения, для более вменяемого кодирования.

Затем Андрей Александреску в своей статье Mojo для DDJ отметил, что впредь, с семантикой перемещения, const о возвращаемых значениях лучше запретить, а более ранний совет Скотта игнорируется.


Теперь я никогда не удосужился изучить различные специализированные аббревиатуры RVO, такие как NRVO и так далее. И главная причина в том, что эти изменил смысл на полпути, изначально имея одно значение с некоторыми пользовательскими функциями в компиляторе g ++. Терминология здесь просто беспорядок.

Так что, если моя терминология неверна и я действительно использовал какую-то другую аббревиатуру, пожалуйста, не стесняйтесь исправлять! 🙂

8

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

Других решений пока нет …

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