सिद्धांत रूप में, कंपाइलर आधार वर्गों को अलग-अलग रख सकता है। सी ++ 03 §10 अनुच्छेद 5 कहते हैं:
एक आधार वर्ग subobject एक लेआउट (3.7) एक ही प्रकार के एक सबसे व्युत्पन्न वस्तु के लेआउट से अलग हो सकता है।
StackedCrooked mentioned रूप में, यह संकलक आधार वर्ग A
के अंत तक गद्दी जोड़ने जब यह अपने आप ही वस्तु के रूप में मौजूद है द्वारा हो सकता है, लेकिन जब यह एक आधार वर्ग है संकलक कि गद्दी नहीं जोड़ सकते हैं। इससे उप-वर्ग के सदस्यों के पहले कुछ बाइट्स को ओवरराइट करने के लिए A::clear()
का कारण होगा।
लेकिन व्यवहार में, मैं इस या तो जीसीसी या विजुअल स्टूडियो 2008 इस परीक्षण का उपयोग के साथ होने की प्राप्त करने में सक्षम नहीं किया गया है:
struct A
{
void clear() { memset(this, 0, sizeof(A)); }
int age;
char type;
};
struct B : public A
{
char x;
};
int main(void)
{
B b;
printf("%d %d %d\n", sizeof(A), sizeof(B), ((char*)&b.x - (char*)&b));
b.x = 3;
b.clear();
printf("%d\n", b.x);
return 0;
}
और संशोधित A
, B
, या दोनों 'पैक' होने के लिए (वीएस में #pragma pack
और जीसीसी में __attribute__((packed))
के साथ), मुझे किसी भी मामले में अधिलेखित होने के लिए b.x
नहीं मिला। अनुकूलन सक्षम थे। आकार/ऑफसेट के लिए मुद्रित 3 मान हमेशा 8/12/8, 8/9/8, या 5/6/5 थे।
स्रोत
2011-08-18 21:29:08
मुझे आशा है कि आप हमें अपना उत्तर, जोहान्स प्रदान करेंगे। –
@Fred उत्तर पहले से ही नीचे दिया गया है। इसलिए मुझे "खुलासा" करने की कोई ज़रूरत नहीं है। –