Constructor de copia vs optimización valor de retorno
-
21-08-2019 - |
Pregunta
En un anterior pregunta, parecía que una llanura función de retorno por valor siempre copias return
su argumento en la variable se asigna de la misma.
Es esto requerido por el estándar, o puede ser optimizado la función mediante la construcción de la 'asignado a' variable incluso dentro del cuerpo de la función?
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 );
}
Solución
La norma permite a cualquier nivel de copia omisión aquí:
- construir un local temporal, copia-construirlo en un valor de retorno, y el copia-construir el valor de retorno en el local de "c". o
- construir un temporal local, y copia-constructo que en "c". o
- construir "c" con los argumentos "i, d"
Otros consejos
La norma dice que el constructor de copia no es necesario usar - véase la sección 12.8 / 15:
15 Cada vez que un objeto de clase temporal se copia usando un constructor de copia, y este objeto y la copia tienen el mismo cv-incondicional tipo, una Se permite la aplicación para tratar el original y la copia como dos diferentes formas de referirse a la mismo objeto y no realizan una copia en todo, incluso si la copia de clases constructor o destructor lado tienen efectos.
Y mucho más en el mismo sentido.
Camino no pasa parámetros por referencia y asignar resultado a ella?
Hay una manera muy simple y bueno evitar completamente tales consideraciones - se puede considerar la devolución de un impulso :: shared_ptr al objeto creado - será prácticamente el mismo cuando se trata de la facilidad de uso, sino que su objeto será seguramente no puede copiar innecesariamente -., y será cierto también que si regresa, aunque un par de capas de llamadas de función