2013-10-01 3 views
5

Я тестировал размер базовых классов и производных классов на C++.Размер класса в C++

class X {}; 
class Y : public virtual X {}; 
class Z : public virtual X {}; 
class A : public Y, public Z {}; 

Размер каждого X, Y, Z, A достиг 1,8,8,12 соответственно. Я не могу это понять. Я знаю, что размер по умолчанию для пустого класса равен 1. Поэтому я мог понять, что sizeof X равен 1. Я знаю, что размер Y и Z не будет таким, каким будет добавлен virtual_pointer. Но 8? Я не понимаю. Может кто-нибудь объяснить?

+3

Ориентация указателя. –

+4

Это называется неуказанным поведением: реализация может делать все, что он хочет, чтобы программа работала правильно, и нет требования, чтобы поведение было документировано или даже надежно. – DanielKO

ответ

2

Это зависит от реализации в вашем компиляторе. Скажем, я получил 1, 8, 8, 16 в GCC.

Для класса Y он может создать виртуальную базу для виртуальной базы X плюс 1 байт для пустого тела класса. После 4-байтового выравнивания он составляет всего 8 байтов.

UPD: Также это может зависеть от того, компилируете ли вы для архитектуры с 32 или 64 битами. Указатель vtable на 64-битной платформе займет 8 байтов, следовательно, размеры Y и Z.

Таким образом, полный ответ на ваш вопрос зависит от компилятора и целевой платформы.

+0

Это не совсем «плюс 1 байт для пустого тела класса», это «плюс 0 байт, округленное до первого ненулевого кратного 4». – Mehrdad

+0

Размер производного класса должен быть не меньше, чем размер базового класса. Идея заключалась в том, что в классе Y мы имели 4 байта vtable + 1 байт для пустого тела класса X (не пустое тело Y). Затем выровняйте 5 байтов и получите 8 байтов. Опять же, это также зависит от того, скомпилируем ли мы 32 или 64 бит. – Karadur

+3

Возможно, это не то, что вы имели в виду, но пустое тело класса не 1 байт. Это нулевые байты. Единственное, что, как только весь тип объекта известен, объект должен быть как минимум одним байтом, поэтому, если он равен нулю, добавляется один байт. Но пустой класс не вносит никаких байтов сам по себе. – Mehrdad

Смежные вопросы