Рассмотрим следующий класс:
class intchar {
int x;
char y;
};
Он имеет размер 8 на всех основных компиляторах на x86.
Рассмотрим теперь производный класс:
struct derived : intchar {
char z;
};
На g cc и clang для Linux 1 этот класс также имеет размер 8, хотя он не пустой и является производным от базового класса размера 8. Таким образом, хранилище для derived::z
перекрывает объект base
: z
хранится в заполнении base
.
Это не происходит в других сценариях ios. Например, если я изменю intchar
на struct
вместо class
, тогда derived
как размер 12: нет перекрытия.
Есть ли какое-либо условие или черта, которую я могу проверить на базовый класс , который исключает перекрытие? В этом конкретном примере c работает std::is_aggregate
, но я не знаю ни одной причины, по которой это должно быть так или не получится в другом примере.
1 Как ни странно, i cc здесь несовместим, сообщая о размере derived
как 12, так что я предполагаю, что он не совместим с C ++ ABI с clang или g cc.