sizeof求类的大小和求结构体的大小,有一定的相似性,但又不完全相同,因为类存在这继承和派生、存在着虚函数。
1、空类大小
对于一个空类,使用sizeof求得其大小为1。
2、简单类
如下定义一个类,
class A
{
public:
int a;
private:
char b;
};
使用sizeof求这种简单类,结果和求结构体的sizeof是一样的,需要考虑偏移和对齐。要注意的是static变量不属于类的一部分,如果类中定义了static变量,求sizeof时可以忽略它们。
3、带虚函数的类
虚函数放在虚表中,类中定义了虚函数,需要存放一个指向虚表的指针。
class A
{
public:
int a;
virtual void f(){}
};
上述代码的sizeof结果为sizeof(A.a)+sizeof(指针)。
当有多个虚函数时,仍然只需要一个指向虚表的指针,因此如下代码的结果和上述代码一样:
class A
{
public:
int a;
virtual void f(){}
virtual void f2(){}
virtual void f3(){}
};
4、普通继承
class A
{
public:
int a;
char b;
};
class B
{
char c;
};
上述代码结果取决于编译器,比如在Codeblocks中结果为8,这说明将char c和char b放到一起了,而在VS2010中,结果为12。不过对如下代码:
class A
{
public:
int a;
private:
char b;
};
class B : public A
{
public:
int d;
char c;
};