2011-06-21 21 views
9
#include <iostream> 

using namespace std; 

class Test 
{ 
public: 
    Test() 
    { 
     printf("construct ..\n"); 
    } 

    ~Test() 
    { 
     printf("destruct...\n"); 
    } 
}; 

Test Get() 
{ 
    Test t = Test(); 
    return t; 
} 

int main(int argc, char *argv[]) 
{ 
    Test t = Get(); 
    return 0; 
} 

la salida de la consola es:¿Por qué se ha llamado al destructor una sola vez?

$ g++ -g -Wall -O0 testdestructor.cc 
$ ./a.out 

construcción ..

destrucción ...

+0

posible duplicado de [¿Qué son elisión de copia y optimización del valor de retorno?] (Http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) –

Respuesta

10

Su causa de copia-elisión por el compilador cuando se devuelva el valor de la función. En este caso, la elisión de copia se llama RVO - Return Value Optimization.

ver estas

6

optimizaciones del compilador.

En otros compiladores/ajustes de optimización, podría recibir llamadas más de una vez.

Ver esta compilación: http://codepad.org/8kiVC3MM

Salida:
1 constructo ..
2 destrucción ...
3 destrucción ...
4 destrucción ...
5 destrucción ..

Tenga en cuenta que el constructor definido no se llamó todas esas veces porque el compilador-gen en lugar de eso, se llamaba al constructor de copia severa.

Ver esta compilación: http://codepad.org/cx7tDVDV

... donde he definido un constructor de copia extra en la parte superior de su código:

Test(const Test& other) 
{ 
    printf("cctor\n"); 
} 

Salida:
1 constructo ..
2 cctor
3 destruct ...
4 cctor
5 destru ct ...
6 cctor
7 destrucción ...
8 destrucción ...

2

Se llama optimización de valor de retorno o RVO.

2

Pruebe g++ -fno-elide-constructors (y defina un constructor de copia que imprima un mensaje).

+0

sí, con -fno-elide-constructors veo todos los destructores – qiuxiafei

Cuestiones relacionadas