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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top