Из того, что я знаю, размер класса в C ++ зависит от следующих факторов:
- Размер всех нестатических элементов данных.
- Порядок данных членов.
- Если заполнение байтов включено или нет.
- Размер его непосредственного базового класса.
- Существование виртуальных функций.
- Режим наследования (виртуальное наследование).
Теперь я создал 2 класса, как показано ниже -
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;
};
Теперь о проверке размеров А и БИ см.
- размер А: 16
- размер B: 16
я предполагаю, что символ c в классе B размещен в "дыре" слева в классе A.
Но что меня смутило, так это сценарий, приведенный ниже.
class A{
public:
int a;
short d;
int b;
char s;
};
class B : public A{
public:
char c;
};
Теперь размер становится
- размер А: 16
- размер B: 20
Я не могу понять причину этой разницы.
c++
inheritance
memory
j.doe
источник
источник
Ответы:
Itanium ABI использует определение POD в C ++ 03 для определения классов, которые являются «POD для макета». Наличие закрытых членов данных лишает класс возможности быть агрегатом и, следовательно, POD в C ++ 03:
Наличие класса POD отключает повторное использование хвостового отступа :
Таким образом, в вашем первом примере
A
это не POD для целей компоновки, и его хвостовой отступ может использоватьсяB::c
, но во втором примере это POD, и его хвостовой отступ не может быть использован повторно.источник