सी ++ कंपाइलर निम्न स्थिति में डिफ़ॉल्ट प्रतिलिपि निर्माता को संश्लेषित करेगा। (अंदर सी ++ ऑब्जेक्ट मॉडल से)
- वर्ग एक वर्ग है जिसके लिए एक प्रतिलिपि निर्माता मौजूद है के एक सदस्य वस्तु शामिल है।
- जब कक्षा को बेस क्लास से लिया जाता है जिसके लिए प्रतिलिपि निर्माता मौजूद होता है।
- जब वर्ग एक या अधिक आभासी कार्यों की घोषणा करता है
- जब कक्षा विरासत श्रृंखला से ली जाती है जिसमें एक या अधिक आधार वर्ग आभासी होते हैं।
हम कक्षा ए को 4 स्थितियों में नहीं देख सकते हैं। तो सीएल इसके लिए डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर संश्लेषित नहीं करते हैं। शायद यही कारण है कि 2 temp एक वस्तुओं का निर्माण और नष्ट कर दिया।
निराशाजनक खिड़की से, हम निम्नलिखित कोड देख सकते हैं, कोई ए :: ए कहा जाता है।:
B b;
00B317F8 lea ecx,[b]
00B317FB call B::B (0B31650h)
00B31800 mov dword ptr [ebp-4],0
func(b);
00B31807 mov al,byte ptr [ebp-12h]
00B3180A mov byte ptr [ebp-13h],al
00B3180D mov byte ptr [ebp-4],1
00B31811 movzx ecx,byte ptr [ebp-13h]
00B31815 push ecx
00B31816 call func (0B31730h)
लेकिन अगर हम विनाशक वर्चुअल बनाते हैं। हमें निम्नलिखित डिस्सेबल कोड मिलेंगे, हम ए :: ए को बुला सकते हैं। फिर परिणाम अपेक्षित है, केवल 1 ऑब्जेक्ट बनाया गया है।
B b;
00331898 lea ecx,[b]
0033189B call B::B (03316A0h)
003318A0 mov dword ptr [ebp-4],0
func(b);
003318A7 push ecx
003318A8 mov ecx,esp
003318AA mov dword ptr [ebp-1Ch],esp
003318AD lea eax,[b]
003318B0 push eax
003318B1 call A::A (0331900h)
003318B6 mov dword ptr [ebp-20h],eax
003318B9 call func (03317D0h)
VS2010 पर यह परीक्षण किया है, परिणाम है "132,242" – Apokal
बजना 4.1 पैदा करता है "13242" –
वी.एस. रिलीज़ संस्करण केवल 13242 उत्पादन नहीं बल्कि डिबग संस्करण – billz