Согласно стандарту C ++ (унаследованному от C) пустые структуры, тем не менее, имеют ненулевой размер. Причина этого (жалкое ИМХО) в том, что две разные переменные должны иметь разные адреса. Теперь наследование пустой структуры не всегда «раздувает» объект. Но в некоторых ситуациях это так.
У меня довольно изощренная архитектура классов, включающая яростное шаблонное вуду.В результате финальные классы (экземпляры которых мне нужно создать) могут иметь несколько унаследованных пустых структур. В связи с этим часть из них со временем может быть раздутой. И хуже всего то, что их структура памяти фактически зависит от порядка наследования.
Я бы хотел избавиться от всего этого, если можно.
Есть ли компилятор C ++, который можно настроить для устранения этой потери места за счет нарушения стандарта?
Редактировать:
Я имею в виду следующее:
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);
Не только пустые структуры раздувают объект (когда унаследовано более одной такой вещи), но также результат зависит от порядка наследования пустых структур.