1、空类的大小为1字节
2、字节对齐的问题
如下例:
一个类的大小可以被下面的方式改变:
class
{
bool
int
bool
};
这个结果可能会让你吃惊,因为A的成员总数是6个字节:1+4+1个字节。那另6字节是哪儿来的?编译器在每个bool成员后面都插入了3个填充字节以保证每个成员都是按4字节排列,以便分界。你可以减少A的大小,通过以下方式:
class
{
bool
bool
int
};
这一次,编译器只在成员c后插入了2个字节。因为b占了4个字节,所以就很自然地把它当作一个字的形式排列,而a和c的大小1+1=2,再加上2个字节就刚好按两个字的形式排列B。
3、虚函数:如果有虚函数,类的大小+4个字节。(用来存放vptr)
例:
class
A
{
virtual
void
foo();
int
i;
char
c;
}; sizeof(A)
=
12
=
vptr
+
sizeof(i)
+
(sizeof(c)
+3);
class B
:public
A
{
void
foo1();
static
int
haha;
long
ll;
} sizeof(B)
=
16
=
sizeof(A)
+
sizeof(ll);
4、虚基类指针:如果是虚继承,则子类的大小为:虚基类的大小 + 4个字节(用来存放指向虚基对象的指针)+子类新增成员的大小。
{
};
class
{
}
4、虚基类指针:如果是虚继承,则子类的大小为:虚基类的大小 + 4个字节(用来存放指向虚基对象的指针)+子类新增成员的大小。
例:
class A
{
virtual
void
foo(){};
int
i;
int j;
};
{
};
class C: virtual public A
{
char
sz[10];
};sizeof(C) = sizeof(A) + 4 +
sizeof(sz[10])
= 12+4+10+2(补齐sz)=28
{
};sizeof(C)