2012-11-19 17 views
30

यदि खाली कक्षा का आकार 0 नहीं हो सकता है, तो कौन सा जादू std :: tuple कर रहा है, तो unique_ptr का आकार 64 बिट मशीन में 8 लौटा रहा है?std :: unique_ptr का कोई आकार ओवरहेड कैसे हो सकता है?

typedef std::tuple<typename _Pointer::type, _Dp> __tuple_type;     
    __tuple_type _M_t; 

कहाँ _Dp Deleter वर्ग है:

unique_ptr में सदस्य के रूप में परिभाषित किया गया है।

संकलक जीसीसी संस्करण 4.7.1 (Debian 4.7.1-7)

+2

यह कार्यान्वयन-निर्भर भी हो सकता है, इसलिए आप यह भी शामिल करना चाहेंगे कि आप किस कंपाइलर के बारे में बात कर रहे हैं। –

+5

मुझे यकीन नहीं है कि 'std :: tuple' आपके प्रश्न में' std :: unique_ptr' से कैसे संबंधित है। क्या आप स्पष्टीकरण दे सकते हैं? – Cameron

+2

@ कैमरॉन, _M_t अद्वितीय_ptr पर अंतर्निहित प्रकार है। – piotr

उत्तर

43

कारण यह है कि typename _Dp = default_delete<_Tp> एक खाली वर्ग है और tuple टेम्पलेट खाली बेस क्लास अनुकूलन को नियोजित करता है।

यदि आप unique_ptr को गैर-डिफ़ॉल्ट डिलीट के साथ तुरंत चालू करते हैं, तो आपको आकार में वृद्धि देखना चाहिए।

+10

थोड़ा सा रीफ्रेश करने के लिए: जब स्वयं द्वारा तत्काल किया जाता है, तो कक्षा में शून्य-शून्य आकार होना चाहिए, लेकिन जब बेस क्लास के रूप में इंस्टाल किया जाता है, तो शून्य आकार की अनुमति होती है। –

+0

संबंधित: http://www.stroustrup.com/bs_faq2.html#sizeof-empty –

28

unique_ptr के रूप में शून्य भूमि के ऊपर हो सकता है निर्दिष्ट क्योंकि केवल एक चीज है यह/नकल करने की प्रक्रिया को संशोधित करने के लिए एक कच्चे सूचक चलती है लागू करने की जरूरत है ; कोई अतिरिक्त जानकारी जरूरी नहीं है। इसलिए unique_ptr को पॉइंटर के अलावा कुछ भी स्टोर करने की आवश्यकता नहीं है और यह सूचक के समान आकार हो सकता है।

आपके विशेष कार्यान्वयन के तरीके के बारे में, यह प्राप्त करता है; केवल सबसे व्युत्पन्न प्रकारों को शून्य से बड़ा आकार होना चाहिए। खाली बेस कक्षाएं शून्य बाइट्स ले सकती हैं। मानक लाइब्रेरी कार्यान्वयन के लिए कंटेनरों में स्टेटलेस एलोकेटर से टुपल तक सभी प्रकार की चीजों के लिए तथाकथित 'खाली बेस क्लास' अनुकूलन का लाभ उठाने के लिए यह काफी आम है।

+0

उत्तर के लिए धन्यवाद, +1 वोट किया गया मैंने ठंडा स्वीकार किया क्योंकि उसके पास कम स्कोर है और एक वैध उत्तर भी प्रदान किया गया है। – piotr

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