Все нижеприведенное будет сделано на GCC 9.1 с использованием Compiler Explorer, в x86-64 с использованием -O3.
У меня есть этот код:
struct Base {
Base() {}
double foo;
int bar;
};
struct Derived : public Base {
int baz;
};
int main(int argc, char** argv)
{
return sizeof(Derived);
}
Он правильно возвращает 16, как и следовало ожидать, 8 байтов для foo, 4 байта для bar и 4 байта для baz. Это работает только потому, что Derived наследуется от Base и поэтому ему не нужно заполнять после bar потому что Derived является одним типом, содержащим элементы Base и Derived.
У меня есть два вопроса, как показано ниже:
Первый вопрос
Если я уберу явный конструктор Base() {}, он начнет возвращать 24 вместо 16. то есть он добавляет отступы после bar и baz.
Я не могу объяснить, почему наличие явного конструктора по умолчанию отличается от наличия неявного конструктора по умолчанию.
Второй вопрос
Если я затем изменю struct на class для Base, он вернется к возвращению 16. Я тоже не могу это объяснить. Почему модификаторы доступа могут изменить размер структуры?