2010-05-07 22 views
10

मान लीजिए मैं:C++ वस्तु आकार

struct Foo: public Bar { 
.... 
} 

फू कोई नया सदस्य varaibles परिचय देता है। फू केवल सदस्य कार्यों का एक गुच्छा पेश करता है & स्थिर कार्य। क्या सी ++ मानक का कोई भी हिस्सा अब मुझे गारंटी देता है कि:

sizeof(Foo) == sizeof(Bar) 

?

धन्यवाद!

+0

यह भी ध्यान दें कि 'बार' था टी 'फू' में निहित है ''''' में मौजूद 'बार' से भिन्न आकार हो सकता है। उदाहरण के लिए, एक सामान्य अनुकूलन आधार वर्गों के आकार शून्य होने पर है, यदि वे खाली हैं, लेकिन nonzero अगर वे बेस-क्लास के रूप में निहित नहीं हैं (जैसा कि सी ++ द्वारा आवश्यक है)। –

उत्तर

11

मैं कम से कम एक परिदृश्य के बारे में सोच सकता है जहां sizeof(Foo) != sizeof(Bar):

class Bar { 
public: 
int m_member; 
}; 

class Foo : Bar { 
    virtual ~Foo(); 
}; 

Foo में एक vtable सूचक होगा जबकि Bar नहीं होगा और पूर्व का आकार एक शब्द बड़ा होगा Bar। 32 बिट डीबग MSVC2010 पर:

sizeof(Foo) - 8 
sizeof(Bar) - 4 

संपादित यह structs के साथ ही कक्षाओं के लिए सच है, मुझे लगता है कि इस बात की पुष्टि करने के लिए परीक्षण reran।

+0

@Betamoo: मैं मतभेदों के बारे में सुनना चाहता हूं और वे इस जवाब से कैसे संबंधित हैं। – tiftik

+5

सी ++ में, स्ट्रक्चर और क्लास के बीच एकमात्र अंतर डिफ़ॉल्ट पहुंच दायरा है। - एक जोड़ा के साथ, भले ही यह वास्तव में कोई फर्क नहीं पड़ता, भाषा पूछती है कि आप लगातार उसी निर्माण का संदर्भ लेंगे। आप "कक्षा फू" घोषित नहीं कर सकते, फिर "स्ट्रक्चर फू"। कम से कम, यदि आप करते हैं, तो यह मान लेगा कि वे वही हैं और (आमतौर पर) असंगत घोषणाओं के बारे में चेतावनी देते हैं। –

+3

@ बीटामू: सी ++ में कोई "structs" नहीं है। सबकुछ एक वर्ग है, भले ही इसे 'स्ट्रक्चर' कीवर्ड के साथ घोषित किया गया हो। – AnT

2

निश्चित रूप से नहीं, विशेष रूप से यदि आपकी कक्षाओं में से कोई भी कार्य virtual है। जबकि सी ++ मानक इस की गारंटी नहीं है, आभासी कार्यों होने लगभग निश्चित रूप से (क्योंकि v-टेबल के।) अपने ऑब्जेक्ट का आकार बदल जाएगा

+0

लेकिन वह कक्षाओं के वर्गों के बारे में बात नहीं कर रहा है .. – Betamoo

+9

स्ट्रक्चर सी ++ में कक्षाओं के समान हैं, केवल अंतर ही डिफ़ॉल्ट एक्सेसर सार्वजनिक है, निजी नहीं है। –

5

हां - यदि वे पीओडी प्रकार हैं। पीओडी प्रकारों को लेआउट compatable (जिसे आप एक से दूसरे में memcpy कर सकते हैं) के लिए guarenteed हैं अगर उनके पास एक ही क्रम में लेआउट-संगत सदस्यों है। चूंकि उप-वर्ग में स्वचालित रूप से उसके सभी बेस क्लास के सदस्यों को एक ही क्रम में होता है और, इस मामले में, कोई अन्य नहीं, वे लेआउट संगत और इस प्रकार एक ही आकार में होंगे। कल्पना के खंड 9.3 देखें।

ध्यान दें कि आदेश पॉड प्रकार होने के लिए वे (अन्य आवश्यकताओं के अलावा) कोई आभासी कार्यों होना आवश्यक है

संपादित

नवीनतम मसौदा मानक दो सेट में पॉड प्रकार के लिए आवश्यकताओं को विभाजित किया है: तुच्छ कक्षाएं और मानक लेआउट कक्षाएं। पॉड कक्षाएं उन है कि दोनों तुच्छ और मानक लेआउट हैं, और मैं, sizeof गारंटी आप चाहते हैं के लिए विश्वास है कि सिर्फ मानक लेआउट किया जा रहा पर्याप्त होता है - वे नहीं भी तुच्छ (और इस प्रकार पॉड होना जरूरत है) कक्षाएं। कल्पना से मानक लेआउट के लिए आवश्यकताएँ हैं:

एक मानक लेआउट वर्ग एक वर्ग है जो:

- प्रकार गैर मानक लेआउट वर्ग का कोई गैर स्थैतिक डेटा सदस्य हैं (या इस प्रकार के सरणी) या संदर्भ,

- इसमें कोई वर्चुअल फ़ंक्शन (10.3) नहीं है और कोई वर्चुअल बेस क्लासेस नहीं है (10।1),

- कोई गैर मानक लेआउट आधार वर्ग है,

- - एक ही अभिगम नियंत्रण (क्लॉज 11) सभी गैर-स्थिर डेटा सदस्यों के लिए,

है या तो कोई गैर है अधिकांश व्युत्पन्न वर्ग में स्थिर डेटा सदस्य और गैर-स्थैतिक डेटा सदस्यों वाले अधिकांश बेस क्लास में, या गैर-स्थैतिक डेटा सदस्यों के साथ कोई आधार वर्ग नहीं है, और

- के समान प्रकार के आधार वर्ग नहीं हैं पहला गैर स्थैतिक डेटा सदस्य .108

+0

मुझे नहीं लगता कि गारंटी है कि क्या सदस्य कार्य हैं, है ना? निश्चित रूप से वर्चुअल सदस्यों के साथ बेस क्लास का उदाहरण और आभासी वाले उप-वर्ग का सुझाव है कि यह नहीं है। –

+1

पीओडी प्रकारों में सदस्य कार्य हो सकते हैं। हालांकि उनके पास वर्चुअल सदस्य फ़ंक्शन नहीं हो सकते हैं। मुझे विश्वास नहीं है कि आधार प्रकार वाले एक प्रकार को पीओडी माना जा सकता है, हालांकि यह हो सकता है? – Stewart

+1

@ मार्क, @ स्टीवर्ट: एक पीओडी में सदस्य कार्य हो सकते हैं, सिर्फ ** आधार नहीं, ** कॉपी कन्स्ट्रक्टर, विनाशक, वर्चुअल फ़ंक्शन, गैर-सार्वजनिक डेटा सदस्य, या इन आवश्यकताओं को विफल करने वाले सदस्य। – Potatoswatter

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