Вопрос

Как вы собираетесь использовать оптимизация возвращаемого значения?
Есть ли какие-либо случаи, когда я могу доверять современному компилятору в использовании оптимизации, или я всегда должен идти безопасным путем и возвращать указатель некоторого типа / использовать ссылку в качестве параметра?

Известны ли какие-либо случаи, когда оптимизация возвращаемого значения не может быть выполнена?, Мне кажется, что компилятору было бы довольно легко выполнить оптимизацию возвращаемого значения.

Это было полезно?

Решение

Всякий раз, когда включена оптимизация компилятора (и в большинстве компиляторов, даже когда оптимизация отключенный), РВО состоится.NRVO встречается немного реже, но большинство компиляторов также выполнят эту оптимизацию, по крайней мере, когда оптимизация включена.

Вы правы, оптимизация является компилятору довольно легко выполнить, вот почему компиляторы почти всегда это делают.Единственные случаи, когда это "не может быть сделано", - это те, где оптимизация не применяется:RVO применяется только тогда, когда вы возвращаете неназванный временный файл.Если вы хотите вернуть именованную локальную переменную, вместо этого применяется NRVO, и хотя компилятору реализовать это немного сложнее, это выполнимо, и у современных компиляторов с этим проблем нет.

Другие советы

Чтобы иметь наилучшие шансы на то, что это произойдет, вы можете вернуть объект, созданный непосредственно в операторе return [кто-нибудь может вспомнить название этой идиомы - я его забыл]:

Foo f() {
    ....
    return Foo( ... );
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top