2011-06-21 10 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; 
} 

कंसोल आउटपुट है:क्यों नाशक केवल एक बार बुलाया गया है?

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

निर्माण ..

विनाश ...

+0

संभावित डुप्लिकेट [कॉपी एलिशन और रिटर्न वैल्यू ऑप्टिमाइज़ेशन क्या हैं?] (Http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) –

उत्तर

6

मुझे लगता है कारण 'गेट' में वापसी मान अनुकूलन है।

http://en.wikipedia.org/wiki/Return_value_optimization

वास्तव में अपने कोड मानक उदाहरण नहीं है पर एक नज़र डालें, लेकिन शायद अपने संकलक इसे यहाँ के रूप में अच्छी तरह से लागू होता है।

10

कॉपी-इलिजन संकलक द्वारा की वजह से इसकी जब आप समारोह से मान। वापसी मूल्य अनुकूलन - इस मामले में, कॉपी-इलिजन RVO कहा जाता है।

इन

6

संकलक अनुकूलन देखें।

अन्य compilers/अनुकूलन सेटिंग पर, यह एक बार से अधिक कहा जाता है हो सकता है।

इस संकलन देखें: http://codepad.org/8kiVC3MM

आउटपुट:
1 निर्माण ..
2 विनाश ...
3 विनाश ...
4 विनाश ...
5 विनाश ..

ध्यान दें कि परिभाषित कन्स्ट्रक्टर को उन सभी समय नहीं कहा गया था क्योंकि संकलक-जनरल erated प्रतिलिपि निर्माता बजाय बुलाया गया था। http://codepad.org/cx7tDVDV

... जहाँ मैं अपने कोड के शीर्ष पर एक अतिरिक्त प्रति निर्माता परिभाषित:

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

आउटपुट:
1 निर्माण ..
2 cctor

इस संकलन देखें
3 विनाश ...
4 cctor
5 destru सीटी ...
6 cctor
7 विनाश ...
8 विनाश ...

2

यह वापसी मान अनुकूलन कहा जाता है, या RVO

2

g++ -fno-elide-constructors आज़माएं (और एक प्रतिलिपि बनाने वाले एक प्रतिलिपि को परिभाषित करें)।

+0

हाँ, साथ -फनो-एलिइड-कन्स्ट्रक्टर मैं सभी विनाशकों को देखता हूं – qiuxiafei