Доверие к оптимизации возвращаемой стоимости - PullRequest
5 голосов
/ 25 января 2010

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

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

Ответы [ 3 ]

8 голосов
/ 25 января 2010

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

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

6 голосов
/ 25 января 2010
2 голосов
/ 25 января 2010

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

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

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

...