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 ); 
}
Foi útil?

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

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