Размер объекта С++

Предположим, что у меня есть:

struct Foo: public Bar {
 ....
}

Foo не вводит новые члены varaibles. Foo вводит только набор функций-членов и статических функций. Любая часть стандарта С++ теперь гарантирует мне, что:

sizeof(Foo) == sizeof(Bar)

?

Спасибо!

Ответ 1

Я мог бы подумать хотя бы о одном сценарии, где sizeof(Foo) != sizeof(Bar):

class Bar {
public:
 int m_member;
};

class Foo : Bar {
    virtual ~Foo();
};

Foo будет иметь указатель vtable, тогда как Bar не будет, а прежний размер будет на одно слово больше, чем Bar. На 32-битном DEBUG MSVC2010:

sizeof(Foo) - 8
sizeof(Bar) - 4

EDIT Это справедливо для структур и классов, я повторил тест, чтобы подтвердить это.

Ответ 2

Да - если это типы POD. Типы POD гарантируют совместимость с макетами (то есть вы можете memcpy от одного к другому), если они имеют совместимые с маской элементы в том же порядке. Поскольку подкласс автоматически содержит все его базовые классы в том же порядке и в этом случае других нет, они будут совместимы с макетами и, таким образом, одинакового размера. См. Раздел 9.3 спецификации.

Обратите внимание, что для того, чтобы быть типами POD, они не должны иметь виртуальных функций (среди других требований)

ИЗМЕНИТЬ

Последний проект стандарта разбил требования к типам POD на два набора: тривиальные классы и стандартные классы макета. Классы POD - это те, которые являются как тривиальным, так и стандартным макетом, и я полагаю, что размер требуемого размера зависит от того, насколько достаточно стандартного макета - они также не должны быть тривиальными (и, следовательно, POD) классами. Требования к стандартной компоновке из спецификации:

Класс стандартного макета - это класс, который:

- не содержит нестатических элементов данных типа нестандартного макета (или массива таких типов) или ссылки,

- не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1),

- имеет тот же контроль доступа (раздел 11) для всех нестатических членов данных,

- не имеет базовых классов нестандартной компоновки,

- либо не содержит нестатических членов данных в самом производном классе, но не более одного базового класса с нестатическими членами данных или не имеет базовых классов с нестатическими элементами данных и

- не имеет базовых классов того же типа, что и первый нестатический элемент данных .108

Ответ 3

Конечно, нет, особенно если какая-либо из функций в любом из ваших классов virtual. Хотя стандарт С++ не гарантирует этого, виртуальные функции почти наверняка изменят размер ваших объектов (из-за v-таблиц.)