在使用sizeof计算类的大小时要注意:
sizeof是用来计算栈中变量的大小的,不涉及全局区,故sizeof计算类的大小时,不考虑静态成员变量的大小;
类与结构体一样,都存在字节对齐问题;
类中普通函数不占用类的大小,类中虚函数不管有多少个只需要占用一个虚函数表指针的大小;
类中常量存在静态存储区不占用类大小,如const、static、enum;
子类的大小=子类新增加的大小+父类大小。
// 64位系统
class C
{
public:
char a; //占用1个字节
static char b; //不占用类大小
void *p; //指针在64位系统中占用8个字节
static int *c; //不占用类大小
virtual void func1(); //虚函数占用一个虚函数表指针的大小
virtual void func2(); //8个字节
};
sizeof(C)计算得到的类大小为:24
因为有字节对齐问题,char a;
需要补7个字节,实际占用8个字节的空间。所以sizeof(C)
计算的是char a;
,void *p
,虚函数表指针
占用空间的大小,总共占用3*8=24个字节。
当对数组进行计算时,结果是数组的总字节数
char a[5];
int b[5];
sizeof(a) = 5;
sizeof(b) = 20; //32bit系统