अगर मैं() एक वर्ग एक (जो मूल्य द्वारा एक वस्तु देता है), और दो कार्यों च() और जी सिर्फ उनकी वापसी चर में अंतर होने:वास्तव में कोई फ़ंक्शन मूल्य से कैसे लौटाता है?
class A
{
public:
A() { cout<<"constructor, "; }
A (const A&) { cout<<"copy-constructor, "; }
A& operator = (const A&) { cout<<"assignment, "; }
~A() { cout<<"destructor, "; }
};
const A f(A x)
{A y; cout<<"f, "; return y;}
const A g(A x)
{A y; cout<<"g, "; return x;}
main()
{
A a;
A b = f(a);
A c = g(a);
}
अब जब मैं लाइन A b = f(a);
निष्पादित, यह आउटपुट करता है:
copy-constructor, constructor, f, destructor
, जो यह मानता है कि ऑब्जेक्ट वाई में f() ऑब्जेक्ट वाई में सीधे बनाया गया है अर्थात ऑब्जेक्ट बी की स्मृति स्थान पर, और कोई अस्थायी शामिल नहीं है।
जबकि जब मैं लाइन A c = g(a);
निष्पादित, यह आउटपुट:
copy-constructor, constructor, g, copy-constructor, destructor, destructor,
।
तो सवाल यह है कि क्यों जी() के मामले में वस्तु को सी के स्मृति स्थान पर सीधे बनाया जा सकता है, जिस तरह से यह f() को कॉल करते समय हुआ था? दूसरे मामले में यह एक अतिरिक्त प्रति-निर्माता (जिसे मैं अस्थायी रूप से शामिल करने की वजह से मानता हूं) कहता हूं?
यदि आप संकलक को अनुकूलन करने के लिए चाहते हैं तो आपको ऑप्टिमाइज़ेशन सक्षम करने के साथ संकलित करना होगा। –
मुझे नहीं लगता कि इसमें कंपाइलर अनुकूलन के साथ कुछ भी करना है क्योंकि मैंने पहले से ही कोशिश की है। – cirronimbo