Это действительно деталь реализации. Когда-то давно я думал, что это может быть ноль или тысяча байтов, что это не имеет отношения к спецификации языка. Но, посмотрев на стандарт (раздел 5.3.3), sizeof
определяется как всегда возвращающий один или более, несмотря ни на что.
Размер наиболее производного класса должен быть больше нуля.
Это необходимо, помимо прочего, для того, чтобы вы могли обрабатывать массивы объектов и указатели на них. Если бы вашим элементам было разрешено иметь нулевой размер, то &(array[0])
было бы идентично &(array[42])
, что приведет к разного рода разрушениям в ваших циклах обработки.
Причина, по которой это может быть не машинное слово, заключается в том, что в нем нет элементов, которые фактически требуют его выравнивания по границе слова (например, целое число). Например, если вы поместите char x; int y;
внутри класса, мой GCC синхронизирует его с восемью байтами (так как второй int должен быть выровнен в этой реализации).