В соответствии со стандартом С++ (унаследованным от C) пустые структуры имеют, тем не менее, ненулевой размер. Причиной этого (жалким ИМХО) является то, что две разные переменные должны иметь разные адреса. Теперь наследование пустой структуры не всегда "раздувает" объект. Но в некоторых ситуациях это так.
У меня довольно сложная архитектура классов, включающая жестокий шаблон voodoo. В результате конечные классы (экземпляры которых мне нужно создать) могут иметь несколько пустых структур, унаследованных. Из-за этого часть их может быть раздута в конце концов. И хуже всего то, что их макет памяти фактически зависит от порядка наследования.
Я бы хотел избавиться от всего этого, если это возможно.
Есть ли компилятор С++, который может быть сконфигурирован для устранения этих космических отходов, за счет стандартного нарушения стандарта?
Edit:
Я имею в виду это:
struct Empty1 {};
struct Empty2 {};
struct NonEmpty {
int Value;
};
struct MyClass1
:public NonEmpty
,public Empty1
,public Empty2
{
};
struct MyClass2
:public Empty1
,public NonEmpty
,public Empty2
{
};
struct MyClass3
:public Empty1
,public Empty2
,public NonEmpty
{
};
STATIC_ASSERT(sizeof(MyClass1) == 8);
STATIC_ASSERT(sizeof(MyClass2) == 4);
STATIC_ASSERT(sizeof(MyClass3) == 8);
Не только пустые структуры раздувают объект (когда более чем одна такая вещь унаследована), но и результат зависит от порядка наследования пустых структур.