2012-11-14 14 views
8

में रेखांकित किया जाता है, मुझे एक अजीब समस्या दिखाई दे रही है जहां सदस्य विधियों को रेखांकित नहीं किया जा रहा है यदि मैं विनाशक को परिभाषित करता हूं।एक विनाशक को परिभाषित करने से सदस्य कार्यों को

उदाहरण कोड:

#include <cstdio> 

class Foo 
{ 
public: 
    Foo(int arg) : data(arg) {} 
    ~Foo(void) {} 

    Foo bar(void) const { return Foo(7); } 

    int data; 
}; 

int main(void) 
{ 
     Foo a(3); 
     Foo b = a.bar(); 

     printf ("%i", b.data); 
} 

डिफ़ॉल्ट नाशक का उपयोग कर रहे हैं, तो मैं कुछ इस तरह मिलती है:

main: 
sub   rsp,28h 
lea   rcx,[string "%i" (013FB8ADA0h)] 
mov   edx,7 
call  printf (013FB81068h) 
xor   eax,eax 
add   rsp,28h 
ret 

लेकिन अगर मैं उपरोक्त कोड में के रूप में अपने खुद के खाली नाशक परिभाषित करते हैं,:

Foo::bar: 
mov   dword ptr [rdx],7 
mov   rax,rdx 
ret 

main: 
sub   rsp,28h 
lea   rdx,[b] 
call  Foo::bar (013FA11000h) 
mov   edx,dword ptr [b] 
lea   rcx,[string "%i" (013FA1ADA0h)] 
call  printf (013FA11088h) 
xor   eax,eax 
add   rsp,28h 
ret 

विजुअल स्टूडियो 2012 (v110) का उपयोग करके रिलीज बिल्ड के रूप में संकलित, हालांकि विजुअल स्टूडियो की भी कोशिश की 2010 (v100)। मैंने किसी भी भाग्य के साथ विधि को इनलाइन करने के लिए इसे मनाने में मदद करने के लिए सेटिंग/ओबी 2 की कोशिश की।

मैं असेंबली के साथ पर्याप्त परिचित नहीं हूं कि यह जानने के लिए कि वह क्या करने की कोशिश कर रहा है, शायद कल मैं इसे देखने के लिए इसे समझने की कोशिश करूंगा यदि कोई संकेत देता है। क्या किसी ने कोई प्रकाश डाला है कि एक खाली विनाशक को परिभाषित करने से विधि को रेखांकित किया जा सकता है?

संपादित करें [17/11/2012]

मैंने उपरोक्त कोड को अधिक सरल (मूल रूप से मैं अपने वेक्टर वर्ग पर काम कर रहा था) अपडेट किया।

किसी सदस्य विधि से एक आदिम प्रकार को लौटने से लगता है कि यह सही ढंग से रेखांकित हो रहा है, यह केवल एक मुद्दा है जब मैं अपनी कक्षा का उदाहरण देता हूं।

+0

मेरा समाधान सहायक था? –

उत्तर

2

दृश्य स्टूडियो विनाशकर्ता (खाली है या नहीं) के रूप में "जटिल" के साथ कक्षाएं व्यवहार करता है और वे और अधिक कुछ अनुकूलन का परित्याग करने की संभावना होगी:
के रूप में नीचे दिए गए कोड को संशोधित परिभाषित नाशक के साथ इस अनुकूलन सक्षम था। यदि आपकी कक्षा सरल और गति संवेदनशील है, तो डिफ़ॉल्ट विनाशक का उपयोग करें।

+0

आपके उत्तर पर विस्तार करने के लिए, निम्नलिखित एमएसडीएन आलेख [इनलाइन, __inline, __forceinline] (http://msdn.microsoft.com/en-us/library/z8y1yy88 (v = vs.71) .aspx) बताता है कि संकलक किसी फ़ंक्शन को इनलाइन नहीं कर सकता है, यदि फ़ंक्शन किसी अवांछित ऑब्जेक्ट को मूल्य से वापस करता है, जब/GX,/EHs, या /EHa.* ऐसा लगता है कि मेरी ऑब्जेक्ट को अविभाज्य के रूप में परिभाषित किया गया है क्योंकि इसमें उपयोगकर्ता परिभाषित विनाशक है (यहां तक ​​कि हालांकि यह खाली है)। "सी ++ अपवाद सक्षम करें" ध्वज को अक्षम करने से ऑब्जेक्ट को फिर से व्यवस्थित करने की अनुमति मिलती है। – Gareth

+0

एनबी। एक संदर्भ (ऑब्जेक्ट पर) लौटने से यह भी रेखांकित किया जा सकता है। – Gareth

0

वीएस 2010 में ऐसा लगता है कि संकलक संकलन समय में अंतिम मान की गणना करता है और इसे a के मान के लिए केवल ढेर में लोड करता है।

inline void operator = (const __m128 v) 
{ 
    data = v; 
} 

inline __m128 operator* (const Vector4& a) const 
{ 
    return _mm_mul_ps(data, a.data); 
} 
+0

पूरी तरह उत्तर नहीं देता है कि संकलक विधि को रेखांकित क्यों नहीं कर रहा है, हालांकि मैं अपने वेक्टर वर्ग पर काम करते समय निश्चित रूप से इसका उपयोग करूंगा क्योंकि मुझे इस दृष्टिकोण की तरह लगता है। – Gareth

संबंधित मुद्दे