2009-03-20 19 views
6

En un previous question, parecía que una función simple de retorno por valor copia siempre su argumento return en la variable que se le asignó.Copia del constructor frente a la optimización del valor de retorno

¿Es esto requerido por la norma, o puede optimizarse la función construyendo la variable 'asignada a' 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); 
} 

Respuesta

7

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
  • construye un local temporal, y copia y construye eso en "c". O
  • constructo "c" con los argumentos "I, D"
+0

¿Podría proporcionar el número de sección de la norma, por favor? –

+0

Lo mismo que publicó Neil: 12.15. ¿Lo interpretas de manera diferente? –

7

La norma dice que el constructor de copia no es necesario usar - véase la sección 12.8/15:

15 Siempre que un objeto de clase temporal se copia usando un constructor de copia, y este objeto y la copia tiene el tipo misma cv-no calificado, se permite una implementación para tratar el original y la copia como dos maneras diferentes de referirse a la mismo objeto y no realizar una copia en todo, incluso si la clase copia constructor o destructor tiene efectos secundarios .

Y mucho más en una vena similar.

+0

12.5 en mi estándar de 1998 es "Tienda gratuita" ¿se refiere a algún otro estándar? –

+0

Debería haber sido 12.8/15 –

-1

hay una forma muy sencilla y buena para evitar completamente tales consideraciones - se puede considerar la devolución de un impulso :: shared_ptr al objeto creado - será prácticamente el mismo en cuanto a la usabilidad, pero seguramente su objeto no se copiará innecesariamente, y también será cierto si lo devuelve a través de un par de capas de llamadas a funciones.

+0

no es bueno para shared_ptr std :: string o std :: pair o std :: vector. –

+0

Para evitar la construcción de copias, podría usar heap i.s.o. almacenamiento de pila Sé que:)/ Pero quería saber si puedo confiar en el compilador, es decir, el estándar para _guarantee_ llamar a mi constructor de copia. Lo cual no puedo. – xtofl

+0

curioso: ¿por qué necesita esta garantía de todos modos xtof? –

0

Way no pasa el parámetro por referencia y le asigna el resultado?

+0

porque es más feo y menos flexible en el sitio de llamadas. debería hacerse solo en lugares críticos para el rendimiento. –

+0

O cuando necesita valores devueltos múltiples (un estado y un valor por ejemplo) – xtofl

Cuestiones relacionadas