Почему размер Derived4
класс показывает 8 байтов?
class Empty
{};
class Derived4 : virtual public Empty
{
char c;
};
Под 32-битной машине G ++ генерирует 1 байт для пустого класса (Симметричного для представления имени класса в памяти). Это предполагаемое поведение.
Вы наследуя Empty
в Derived4
в virtual public
с результатом в создании __vptr
переменной в классе Derived4
компилятором по умолчанию. Таким образом, класс Derived4
будет выглядеть примерно так,
class Derived4 {
void* __vptr; // 4 bytes
char c; // 4 bytes as 1 char + 3 for structure padding
};
поэтому размер указанного класса в 8 байт, я надеюсь, что вы с этим согласны.
В то время как размер Derived2
класса показывает 4 байта?
class Empty
{};
class Derived2 : virtual public Empty
{};
Здесь же принцип применит и для пустого класса 1 байта и наследования в Empty
Derived4
в качестве виртуальных результатов __vptr
переменного, вставленных в Derived4
классе. Таким образом, размер Dervied4
: sizeof(void*)
; который представляет собой не что иное, как размер 4 байта в 32-битной машине.
Заполнение границы слова? Что произойдет, если вы добавите поля 'char'? – millimoose
Это реализация определена и, следовательно, довольно трудно ответить, но зачем вам все равно? – nijansen
это была бы моя ставка.vtable вызывает лишние 4 байта, и смысл «char» составляет всего 1 байт, в итоге вы получаете в общей сложности 5. компилятор, вероятно, делает его 8 байтов, там есть инструкции для работы с 8 байтовыми значениями – Jake