2011-08-01 8 views
7
कोड के साथ

:sizeof खाली वर्ग

#include <iostream> 

class A {}; 
class B { char x; }; 

int main() 
{ 
    std::cerr << sizeof(A) << " " << sizeof(B) << std::endl; 
} 

मुझे पता है कि यह एक खाली वर्ग के आकार पूछने के लिए एक आम साक्षात्कार सवाल है - और मैं जानता हूँ कि इस सवाल का जवाब एक है।

मेरा प्रश्न है ... एक खाली कक्षा के लिए "1" बाइट में क्या होता है (मैं इसे खाली अनुमान लगा रहा हूं), और संकलक आंतरिक रूप से ऐसा करने के लिए क्या करता है ताकि sizeof Bsizeof A जैसा ही हो इस मामले में?

मैं चाहूँगा पूरी तरह से इसे समझने की बजाय सिर्फ उत्तर जानते हैं।

+0

यह संकलक के कार्यान्वयन पर निर्भर करता है। सवाल भी है: आप परवाह क्यों करते हैं? –

+8

कौन सा साक्षात्कार में पूछता है? यह एक भयानक साक्षात्कार सवाल है। – nmichaels

+2

यहाँ एक नज़र डालें: http://stackoverflow.com/questions/621616/c-what-is-the-size-of-an-object-of-an-empty-class – a1ex07

उत्तर

8

यह वास्तव में एक सार्थक सवाल यह है: क्रम सिर्फ एक बाइट पर कब्जा कर लिया के रूप में तो यह है कि कोई अन्य वस्तु में अपनी स्थिति पर आवंटित किया जाएगा चिह्नित करता है। लेकिन बाइट पर कब्जा करने के लिए वहां कुछ भी "आयोजित" नहीं है।

इस नियम के लिए एकमात्र कारण है कि वस्तुओं विशिष्ट रूप से पहचान होना चाहिए है। किसी ऑब्जेक्ट की पहचान स्मृति में उस पते से की जाती है। यह सुनिश्चित करने के लिए कि कोई भी दो ऑब्जेक्ट्स का एक ही पता नहीं है (बेस क्लास ऑब्जेक्ट्स के मामले में छोड़कर), रिक्त वर्गों की ऑब्जेक्ट्स गैर-शून्य आकार के द्वारा "कब्जा" स्मृति में होती हैं।

class Foo { 
    int a; 
    char b; 
}; // sizeof(Foo) > sizeof(int) + sizeof(char) 

नहीं एक सी ++ वस्तु में सभी स्मृति एक नाम की जरूरत है:

+0

फिर भी IMHO -। यह एक बहुत ही कमजोर तर्क है। तो क्या होगा यदि दो * खाली * ऑब्जेक्ट्स अपना प्रारंभिक पता साझा करते हैं? मेरा मानना ​​है कि के एंड आर सी के समय में ठीक था, जब वैसे भी * खाली * वस्तुओं को बनाने में कोई बात नहीं थी। सी ++ चीजों के आगमन के साथ ओटीओएच बदल गया है। आप गैर-तुच्छ डी'ओआर के साथ एक खाली वस्तु चाहते हैं।प्लस खाली वस्तुएं टेम्पलेट मेटा-प्रोग्रामिंग – valdo

+4

@valdo में उत्पन्न हो सकती हैं यह एक गलतफहमी है। वस्तुओं की अनूठी पहचान * आवश्यक * है। सी ++ में ऑब्जेक्ट्स * परिभाषित * स्मृति पर हैं (परिभाषा के अनुसार वस्तु = स्मृति स्थान)। यदि वस्तुएं एक पता साझा करती हैं तो रनटाइम उन्हें अलग करने में असमर्थ होगा। यह सी ++ प्रकार प्रणाली के अंतर्गत सभी प्रकार की धारणाओं को तोड़ देगा। केवल एक ठोस उदाहरण देने के लिए, यह सरणी और सूचक अंकगणित तोड़ देगा। –

4

कि एक खाली वस्तु पर कब्जा कर लिया स्मृति में से एक बाइट होना चाहिए सी में कोई आवश्यकता नहीं है ++ मानक। यह पूरी तरह कार्यान्वयन पर आधारित है।

संपादित करें: सच है, यह अनुरूप है (आईएसओ/आईईसी 14882 p.149):

9 वर्ग [वर्ग]
..
..
..
3 पूर्ण वस्तुओं और सदस्य subobjects के वर्ग प्रकार अशून्य आकार होगा ...

+2

यह * एक आवश्यकता है हालांकि वस्तुओं को उनके विशिष्ट पते (या प्रकार) द्वारा विशिष्ट रूप से पहचाना जा सकता है। –

+1

@cprogrammer - यह यह भी दो हो सकता है एक बाइट होने के लिए नहीं है, :) –

0

आप अक्सर इस तरह की कक्षाओं में ऐसा ही प्रभाव देख सकते हैं। किसी ऑब्जेक्ट के अंदर अनन्य स्मृति को "पैडिंग" कहा जाता है। आपकी खाली कक्षा में पैडिंग का एक बाइट होता है। सी ++ कंपाइलर्स पैडिंग डालने का सबसे आम कारणों में से एक है सरणी प्रकार में कक्षा के उपयोग की अनुमति देना।

+0

यह सही है, लेकिन खाली कक्षाओं के मामले में, अन्य उत्तरों द्वारा समझाया गया एक अलग प्रभाव काम पर है। खाली कक्षाओं में शून्य-शून्य आकार होना चाहिए क्योंकि सी ++ मानक इसकी मांग करता है, लेकिन पैडिंग कुछ ऐसा है जो संकलक लागू करने का विकल्प चुनते हैं। –

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