Все нижеприведенное будет сделано на 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
. Я тоже не могу это объяснить. Почему модификаторы доступа могут изменить размер структуры?