मैं आभासी तालिका और विरासत के साथ कुछ निम्न-स्तर की चीज़ों को कम करने की कोशिश कर रहा हूं।व्युत्पन्न कक्षाओं में vtable की समझ
जब आप दो कक्षाओं को विरासत में जोड़कर और नए आभासी कार्यों को जोड़कर नई कक्षा बनाते हैं, जहां वास्तव में वीपीआरआर संग्रहीत किया जाएगा?
ऐसा लगता है कि संकलक उस मामले में कुछ 'vptr-optimization' करता है। और मैं इसे समझने की कोशिश कर रहा हूं।
मान लीजिए, हम निम्नलिखित structs है:
struct A
{
int a;
virtual void fa();
};
struct B
{
double b;
virtual void fb();
};
struct C : A, B
{
char c;
virtual void fa();
virtual void fb();
virtual void fc();
};
86 के मामले में और align = 4, A
और B
स्मृति में इस तरह दिखेगा:
+------+------+
A: | vptr | a |
+------+------+
sizeof(A) = 4 + 4 = 8
+------+------+------+------+
B: | vptr | b |
+------+------+------+------+
sizeof(B) = 8 + 8 = 16
लेकिन जब मैं करने की कोशिश C
reassemble, मुझे यह मिलता है:
+------+------+------+------+------+------+------+
C: | vptr | a | vptr | b | c |
+------+------+------+------+------+------+------+
but sizeof(C) = 32
С с;
(C*)&c; // 0x100
(B*)&c; // 0x108
(A*)&c; // 0x100
&c.a; // 0x104
&c.b; // 0x110
&c.c; // 0x118
तो whe फिर C
का vptr है? मुझे लगता है कि कर सकते हैं कि संकलक विलय अलग आभासी टेबल, लेकिन इस मामले में क्यों sizeof(C)
रिटर्न sizeof(A)
+ sizeof(B)
+ sizeof(alligned_char)
+ sizeof (vptr)
struct D : public C {}
एक ही कहानी है (पूर्व A
की vptr और C
।) - वहाँ D
का कोई vptr नहीं है।
मैं जिस कंपाइलर का उपयोग करता हूं वह msvc 2012 x86 है।
क्यों struct बी की जरूरत 8 बाइट में vptr? – walker
@ वाकर मुझे संदेह है कि यह करता है। यह शायद कुछ पैडिंग है। – luk32
संभावित डुप्लिकेट [कितने vptr कक्षा का ऑब्जेक्ट (एकल/एकाधिक विरासत का उपयोग करता है) है?] (Https://stackoverflow.com/questions/3342035/how-many-vptr-will-a-object-of- क्लासस-सिंगल-बहु-विरासत-पास है) – Andrew