Z tego co wiem, wielkość klasy w c ++ zależy od następujących czynników -
- Rozmiar wszystkich niestatycznych elementów danych.
- Kolejność członków danych.
- Jeśli uzupełnianie bajtów jest włączone, czy nie.
- Rozmiar jego bezpośredniej klasy bazowej.
- Istnienie funkcji wirtualnych.
- Tryb dziedziczenia (dziedziczenie wirtualne).
Teraz utworzyłem 2 klasy, jak poniżej -
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;
};
teraz po sprawdzeniu rozmiaru A i BI zobacz
- rozmiar A: 16
- rozmiar B: 16
moje założenie jest takie, że char c w klasie B mieści się w „otworze” pozostawionym w klasie A.
Ale, co mnie pomyliło, to poniższy scenariusz, w którym upubliczniam członków
class A{
public:
int a;
short d;
int b;
char s;
};
class B : public A{
public:
char c;
};
Teraz rozmiar się zmienia
- rozmiar A: 16
- rozmiar B: 20
Nie potrafię zrozumieć przyczyny tej różnicy.
c++
inheritance
memory
J.DOE
źródło
źródło
Odpowiedzi:
Itanium ABI korzysta z definicji POD POD C ++ 03, aby zdefiniować klasy, które są „POD do celów układu”. Posiadanie prywatnych członków danych dyskwalifikuje klasę z bycia agregatem, a zatem POD w C ++ 03:
Bycie klasą POD uniemożliwia ponowne użycie wyściółki ogona :
Tak więc, w twoim pierwszym przykładzie,
A
nie jest POD dla celów układu i jego wyściółka ogona może być użytaB::c
, ale w drugim przykładzie jest POD, a jego wyściółki ogona nie można ponownie użyć.źródło