Soweit ich weiß, hängt die Größe einer Klasse in C ++ von den folgenden Faktoren ab:
- Größe aller nicht statischen Datenelemente.
- Reihenfolge der Datenmitglieder.
- Ob das Auffüllen von Bytes aktiviert ist oder nicht.
- Größe seiner unmittelbaren Basisklasse.
- Die Existenz virtueller Funktionen.
- Vererbungsmodus (virtuelle Vererbung).
Jetzt habe ich 2 Klassen wie folgt erstellt -
class A{
int a;
short s;
int b;
char d;
};// kept a char at last on purpose to leave a "hole"
class B : public A{
char c;
};
Jetzt zur Überprüfung der Größe von A und BI siehe
- Größe von A: 16
- Größe von B: 16
Ich gehe davon aus, dass das Zeichen in Klasse B in dem in Klasse A verbleibenden "Loch" untergebracht ist.
Was mich jedoch verwirrt hat, ist das folgende Szenario, in dem ich die Mitglieder öffentlich mache
class A{
public:
int a;
short d;
int b;
char s;
};
class B : public A{
public:
char c;
};
Jetzt wird die Größe
- Größe von A: 16
- Größe von B: 20
Ich kann den Grund für diesen Unterschied nicht verstehen.
c++
inheritance
memory
J. DOE
quelle
quelle
Antworten:
Das Itanium ABI verwendet die C ++ 03-Definition von POD , um Klassen zu definieren, die "POD für Layoutzwecke" sind. Wenn private Datenelemente vorhanden sind, wird eine Klasse als Aggregat und damit als POD in C ++ 03 disqualifiziert:
Als POD-Klasse wird die Wiederverwendung von Heckpolstern deaktiviert :
In Ihrem ersten Beispiel
A
handelt es sich also nicht um einen POD für Layoutzwecke, und die Schwanzpolsterung kann verwendetB::c
werden. In Ihrem zweiten Beispiel handelt es sich jedoch um einen POD, und die Heckpolsterung kann nicht wiederverwendet werden.quelle