Cópia construtor vs. otimização valor de retorno
-
21-08-2019 - |
Pergunta
Em um anterior pergunta , parecia que uma função simples retorno por valor sempre cópias seu argumento return
na variável a ser atribuído a partir dele.
É este exigido pela norma, ou a função pode ser otimizado através da construção da 'atribuído a' variável mesmo dentro do corpo da função?
struct C { int i; double d; };
C f( int i, int d ) {
return C(i,d); // construct _and_ copy-construct?
}
int main() {
C c = f( 1, 2 );
}
Solução
A norma permite que qualquer nível de cópia omissão aqui:
- construir um local temporário, cópia-construção-lo em um valor de retorno, e copie e construir o valor de retorno para o "c" local. ou
- construir um local temporário, e cópia-construção que em "c". ou
- construção "c" com os argumentos "i, d"
Outras dicas
A norma diz que a necessidade construtor de cópia não ser utilizado - ver secção 12.8 / 15:
15 Sempre que um objeto de classe temporária é copiado usando um construtor de cópia, e este objeto e a cópia ter o mesmo cv-tipo não qualificado, uma implementação está autorizado a tratar o original e a cópia como dois diferentes maneiras de se referir ao mesmo objeto e não executar uma cópia em tudo, mesmo se a cópia classe construtor ou destruidor têm lado efeitos.
E muito mais em uma veia similar.
Way não passar o parâmetro por referência e resultado atribuir a ele?
Há uma maneira muito simples e bom para evitar tais considerações completamente - você pode considerar retornar um boost :: shared_ptr para o objeto criado - será praticamente o mesmo quando se trata de usabilidade, mas o objeto certamente não ser copiadas desnecessariamente -. e vai ser verdade também se você devolvê-lo embora algumas camadas de chamadas de função