2010-03-02 15 views
55

संभव डुप्लिकेट:
C++: What is the size of an object of an empty class?सी ++ में खाली कक्षा का आकार शून्य क्यों नहीं है?

क्यों निम्नलिखित उत्पादन 1 करता है? दो अलग-अलग वस्तुओं एक ही स्मृति का पता करने के लिए के लिए के बाद से है कि यह संभव होगा

#include <iostream> 

class Test 
{ 
}; 

int main() 
{ 
    std::cout << sizeof(Test); 
    return 0; 
} 
+4

एक डमी प्लेसहोल्डर सदस्य है जिसका आकार एक बाइट होता है। चूंकि टेस्ट [10] की एक सरणी के लिए, प्रत्येक ऑब्जेक्ट का एक अद्वितीय पता होना चाहिए। – legends2k

+4

हालांकि एक खाली अनुकूलन 'खाली बेस ऑप्टिमाइज़ेशन' है, जिसका अर्थ है कि यदि आप खाली बेस क्लास (कोई विशेषता नहीं, कोई वर्चुअल विधियों) से प्राप्त नहीं होते हैं, तो आपका वर्ग का आकार नहीं बढ़ेगा। कई (अन्य) स्थितियां हैं, लेकिन यह बताती है कि कुछ परिस्थितियों में भविष्यवाणी से निजी रूप से विरासत क्यों प्राप्त होती है। –

+0

[इसी तरह के प्रश्न 1] (http://stackoverflow.com/questions/1626446) और [समान प्रश्न 2] (http://stackoverflow.com/questions/621616/)। – Lazer

उत्तर

86

मानक आकार 0 की वस्तुओं (और वर्गों क्या है) की अनुमति नहीं है,। यही कारण है कि खाली कक्षाओं में भी आकार (कम से कम) का आकार होना चाहिए।

+2

एचएम ... लेकिन क्या लिंकर उस परवाह करने में सक्षम नहीं होना चाहिए चाहे कितना आकार() रिटर्न? क्या यह दुष्प्रभाव की तरह नहीं है? मैं समझता हूं कि आप क्या कह रहे हैं, लेकिन यह आकार (टेस्ट) के लिए 0 को वापस करने के लिए पूरी तरह से करने योग्य नहीं है। लेकिन अगर मानक ऐसा कहता है, तो ऐसा कहता है। वास्तव में किसी विषय के बारे में जानबूझकर अस्पष्ट होने के बजाय स्पष्ट होने के लिए एक अच्छी बात है। –

+12

@ अजेयबल, तो 'एक [10] का परीक्षण क्या होगा; आकार के रूप में है? और 'आकार/आकार का * ए' 0 से विभाजित होगा और '(टेस्ट * i = a; i! = A + 10; i ++) f (i);' काम करने में भी असफल होगा। मेरा मानना ​​है कि इससे कई समस्याएं पैदा होंगी, क्योंकि आपको उपयोगकर्ता कोड में कंपाइलर्स * और * में बहुत से विशेष मामलों की आवश्यकता है। –

+0

@ जोहान्स, इतना सच है। मैंने इसके बारे में नहीं सोचा था। –

27

यह सुनिश्चित करने के लिए कि दो विभिन्न ऑब्जेक्ट्स अलग-अलग होंगे। इसी कारण से, "नया" हमेशा अलग-अलग ऑब्जेक्ट्स पर पॉइंटर्स देता है।

पूर्ण उत्तर के लिए Stroustrup देखें।

+1

डायरेक्ट पेज लिंक पर जाएं –

20

सी ++ मानक गारंटी देता है कि किसी भी वर्ग का आकार कम से कम एक है। सी ++ मानक कहता है कि किसी ऑब्जेक्ट में एक अन्य ऑब्जेक्ट के समान स्मृति पता नहीं होगा। इसके लिए कई अच्छे कारण हैं।

  1. यह गारंटी देने के लिए कि new हमेशा एक सूचक को एक अलग स्मृति पते पर वापस कर देगा।

  2. शून्य से कुछ डिवीजनों से बचने के लिए। उदाहरण के लिए, पॉइंटर अंकगणित (जिनमें से कई संकलक द्वारा स्वचालित रूप से किए जाते हैं) में sizeof(T) से विभाजित होता है।

नोट लेकिन यह मतलब है कि यह नहीं है कि एक खाली आधार स्तरीय एक व्युत्पन्न वर्ग के आकार के 1 जोड़ देगा:

struct Empty { }; 

struct Optimized : public Empty { 
    char c; 
}; 

// sizeof(Optimized) == 1 with g++ 4.0.1 

Bjarne Stroustrup talks about this भी।

+2

क्या पॉइंटर अंकगणित में _ sizeof (t) '_dividing_ शामिल है? मैं एक उदाहरण के बारे में नहीं सोच सकता। कृपया कम से कम एक उदाहरण जोड़ें। – MSalters

+4

@MSalters: प्रकार T. – wilhelmtell

+1

@MSalters के तत्वों के सरणी पर पुनरावृत्ति: दो पॉइंटर्स का घटाव तत्वों की संख्या देता है, बाइट्स की संख्या के बीच में नहीं। –

3

मॉरीट्स और पीटर ने क्या कहा।

इस संदर्भ कि compilers खाली आधार वर्ग अनुकूलन (EBCO) कर सकते हैं में नोट करने के लिए दिलचस्प है:

#include <iostream> 
struct Foo {}; 
struct Bar : Foo {}; 
int main() { 
    std::cout << sizeof(Foo) << ',' << sizeof(Bar) << std::endl;   
} 

यह शायद प्रिंट होगा "1,1" आप संकलन और में चलाते हैं तो। ईबीसीओ पर Vandevoorde/Josuttis 16.2 भी देखें।

9

किसी भी डेटा सदस्यों और सदस्य फ़ंक्शन के बिना कक्षा को कक्षा के रूप में जाना जाता है। खाली वर्ग की वस्तु का आकार हमेशा 1 बाइट होता है।

जब हम उस समय किसी भी वर्ग की वस्तु बनाते हैं तो वस्तु हमेशा 3 विशेषताओं को प्राप्त करती है i.e.

  1. राज्य
  2. व्यवहार
  3. पहचान

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

+0

यदि कोई वस्तु किसी ऑब्जेक्ट की 3 वर्णों को बंद करना चाहता था यानी 1) राज्य 2) व्यवहार 3) पहचान तो मुझसे पूछो – Shantanu

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