Confiando na otimização do valor de retorno
-
22-09-2019 - |
Pergunta
Como você usa o Otimização do valor de retorno?
Existem casos em que posso confiar em um compilador moderno para usar a otimização ou sempre devo seguir o caminho seguro e retornar um ponteiro de algum tipo/usar uma referência como parâmetro?
Existem casos conhecidos em que a otimização do valor de retorno não pode ser feita? Parece -me que a otimização do valor de retorno seria bastante fácil para um compilador executar.
Solução
Sempre que otimizações do compilador são ativadas (e na maioria dos compiladores, mesmo quando otimizações são Desativado), O RVO acontecerá. O NRVO é um pouco menos comum, mas a maioria dos compiladores também executará essa otimização, pelo menos quando as otimizações estiverem ativadas.
Você está certo, a otimização é Bastante fácil para um compilador executar, e é por isso que os compiladores quase sempre o fazem. Os únicos casos em que "não podem ser feitos" são os que a otimização não se aplica: o RVO se aplica apenas quando você retorna um temporário sem nome. Se você deseja retornar uma variável local nomeada, o NRVO se aplica e, embora seja um pouco mais complexo para um compilador implementar, é factível e compiladores modernos não têm problemas com isso.
Outras dicas
Para ter a melhor chance de ocorrer, você pode devolver um objeto construído diretamente na declaração de retorno [alguém se lembra do nome desse idioma - eu esqueci]:
Foo f() {
....
return Foo( ... );
}
Mas, como em todas as otimizações, o compilador sempre pode optar por não fazê -lo. E no final do dia, se você precisar devolver um valor, não é alternativa para confiar no compilador - ponteiros e referências não o cortarão.