2010-10-12 14 views
8

मूल रूप से यह एक this question की अनुवर्ती है ..आधार वर्गों का शून्य आकार क्यों हो सकता है?

जब मैं स्टैंडर्ड डॉक्स पर गौर मैं इस पाया ..

कक्षा 9.3 में,

पूरा वस्तुओं और सदस्य कक्षा प्रकार के उप-तत्वों में nonzero आकार होगा। 96) ...

हाँ, सच .. लेकिन,

96) बेस वर्ग subobjects हैं तो विवश नहीं।

तो, जब मैं Stroustrup's FAQ में देखा, वहाँ

के रूप में एक उदाहरण है
void f(X* p) 
    { 
     void* p1 = p; 
     void* p2 = &p->a; 
     if (p1 == p2) cout << "nice: good optimizer"; 
    } 

मेरा प्रश्न मैं नहीं समझ सकता है कि यह कैसे एक अनुकूलन और भी कारण है कि आधार वर्ग की अनुमति दी जाती है शून्य आकार है?

+4

मुझे लगता है कि इसका मतलब है कि खाली बेस क्लास * योगदान * व्युत्पन्न कक्षा में कोई अतिरिक्त आकार नहीं है। यदि आप एक खाली बेस क्लास को तुरंत चालू करते हैं तो उसके पास अभी भी न्यूनतम आकार 1. –

+0

@ पॉल आर होगा: आप वास्तव में एक खाली _base_ कक्षा को तुरंत चालू नहीं कर सकते हैं - परिभाषा के आधारभूत आधार किसी अन्य प्रकार के अविभाज्य भाग हैं। आर्मेन Tsirunyan की स्पष्ट परिभाषा भी देखें। – MSalters

+0

मुझे आश्चर्य है कि यह आकार शून्य है और ऐसी सभी चीज़ें आवश्यक हैं। –

उत्तर

11

बेस क्लास शून्य आकार नहीं हो सकता है। केवल बेस क्लास सबोबजेक्ट्स कर सकते हैं। व्युत्पन्न वस्तु का मूल भाग मतलब है।

+0

+1, सरल और स्पष्ट ... :) – liaK

10

यदि बेस क्लास खाली है, तो आपको कभी भी बेस क्लास ऑब्जेक्ट या उसके किसी भी सदस्य का पता (व्युत्पन्न क्लास ऑब्जेक्ट्स एड्रेस से स्वतंत्र नहीं होना चाहिए), इसलिए अपने आकार को अनुकूलित करना कानूनी है ।

जो आपको (कम से कम) स्मृति की एक बाइट बचाता है (स्मृति संरेखण नियमों के कारण अधिक हो सकता है), जो महत्वपूर्ण बचत तक जोड़ सकता है यदि आपके पास स्मृति-बाधित प्लेटफ़ॉर्म पर आपके ऐप में लाखों ऐसी वस्तुएं हैं।

+0

हाँ .. धन्यवाद .. :) – liaK

0

मैं कोई रेमंड चेन नहीं हूं, लेकिन मैं 'अगर यह सच था' खेल खेल सकता हूं।

यदि कोई वर्ग जिसे संदर्भ के रूप में पारित किया जा सकता है तो शून्य आकार हो सकता है, तो किसी बिंदु पर इसे malloc(0) पर पारित किया जा सकता है, जो पूर्ण या एक डिफ्रेन्सेबल पता वापस कर सकता है। फिर दो उदाहरण बराबर दिखाई दे सकते हैं जब उन्हें नहीं करना चाहिए।

यदि यह किसी अन्य वर्ग या बेस-क्लास का सदस्य है, तो इसका पता और आकार युक्त कक्षा आवंटन में अपने प्लेसमेंट से लिया गया है, और यह शून्य आकार के लिए सुरक्षित है।

और शून्य आकार होने के कारण स्मृति दक्षता के लिए अच्छा है।

+0

"यदि यह किसी अन्य वर्ग का सदस्य है, तो इसका पता और आकार युक्त कक्षा आवंटन में अपने प्लेसमेंट से लिया गया है, और यह शून्य आकार के लिए सुरक्षित है। " एक सदस्य उपरोक्त में शून्य आकार नहीं हो सकता है। केवल बेस-स्तरीय सबोबजेक्ट –

+0

@ अमेन त्सुरुनियन, दिलचस्प; क्यूं कर? एफओएफएफ मैक्रोज़ को संरक्षित करने के लिए? – Will

+0

यकीन नहीं क्यों, लेकिन इस संबंध में स्टैंडर्स स्पष्ट है। लेकिन यह एक अच्छा मुद्दा है, मैं इसे कुछ सोच दूंगा, शायद इसमें पॉइंटर्स-टू-सदस्यों के साथ कुछ करना है ... –

0

यह एक अनुकूलन है क्योंकि व्युत्पन्न वर्ग के उदाहरणों की तुलना में कम जगह लेती है, यदि बेस क्लास सबबजेक्ट्स को शून्य-शून्य आकार होना आवश्यक था। इसका मतलब है कि इंटरफेस, या मिक्स-इन्स, या टेम्पलेटेड पॉलिसी क्लास जैसे बेस क्लासेस, उन वर्गों के आकार में वृद्धि नहीं करते हैं जो उन्हें लागू करते हैं या उनका उपयोग करते हैं। आखिरकार, आपके कार्यक्रम को एक ही काम करने के लिए कम स्मृति की जरूरत है।

मुझे इतिहास पर बहुत यकीन नहीं है, लेकिन मुझे लगता है कि इंप्रेशन यह है कि 1 99 0 के दशक में कुछ कंपेलरों ने इसे करना शुरू कर दिया, और मानक समिति ने मौजूदा अभ्यास को मानकीकृत करने का फैसला किया। मुझे लगता है कि एसटीएल टेम्पलेट्स में आवंटन ऑब्जेक्ट्स का प्रसार कारण का हिस्सा था - std::vector आमतौर पर रिक्त बेस ऑप्टिमाइज़ेशन के साथ 3 पॉइंटर्स का आकार और इसके बिना 4 पॉइंटर्स (संरेखण के कारण) का आकार होगा। 1 99 7 से Here's an article पर चर्चा करते हुए - यह स्पष्ट है कि यह लिखा गया था जब यह लिखा गया था, लेकिन यह मूल रूप से मानक अभ्यास है।

0

किसी ऑब्जेक्ट का आकार इसके सदस्यों के संचयी आकार के अलावा कुछ भी नहीं है। और नहीं, कोई कक्षा शून्य आकार नहीं हो सकती है, यहां तक ​​कि एक खाली कक्षा में 1 बाइट का आकार होगा।

क्या द्वारा

Base class subobjects are not so constrained.

यहाँ मतलब है कि वस्तु ही किसी भी स्थान का उपभोग नहीं होगा बल्कि यह है सदस्यों होगा है। तो किसी ऑब्जेक्ट का पता उसके पहले सदस्य सबोबजेक्ट के साथ मिल सकता है, जैसा arrays के मामले में होता है। अनुकूलन करता है।

व्युत्पन्न कक्षा के मामले में, इसमें मूल श्रेणी वस्तु शामिल होगी, जो खाली भी 1 बाइट का उपभोग करेगी, इसलिए उपरोक्त अनुकूलन व्युत्पन्न वर्ग के लिए मान्य नहीं है।

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