Только данные экземпляров увеличивают размер экземпляров класса (во всех известных мне реализациях), за исключением того, что если вы добавляете виртуальные функции или наследуете класс с виртуальными функциями, то вы получаете одноразовый удар для v табличный указатель.
Кроме того, как правильно сказал кто-то другой, минимальный размер класса составляет 1 байт.
Некоторые примеры:
// size 1 byte (at least)
class cls1
{
};
// size 1 byte (at least)
class cls2
{
// no hit to the instance size, the function address is used directly by calling code.
int instanceFunc();
};
// sizeof(void*) (at least, for the v-table)
class cls3
{
// These functions are indirectly called via the v-table, a pointer to which must be stored in each instance.
virtual int vFunc1();
// ...
virtual int vFunc99();
};
// sizeof(int) (minimum, but typical)
class cls4
{
int data;
};
// sizeof(void*) for the v-table (typical) since the base class has virtual members.
class cls5 : public cls3
{
};
Реализации компилятора могут обрабатывать множественное виртуальное наследование с помощью нескольких указателей v-таблицы или других других методов, поэтому они также будут влиять на размер класса.
Наконец, параметры выравнивания данных элемента могут оказать влияние. Компилятор может иметь некоторую опцию или #pragma
, чтобы указать, что данные элемента должны иметь начальный адрес, кратный указанному количеству байтов. Например, с выравниванием по 4-байтовым границам и предполагая sizeof(int) = 4
:
// 12 bytes since the offset of c must be at least 4 bytes from the offset of b. (assuming sizeof(int) = 4, sizeof(bool) = 1)
class cls6
{
int a;
bool b;
int c;
};