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