风言枫语  
class no_virtual
{
public:
      void fun1() const{}
      int    fun2() const { return a; }
private:
      int a;
}

class one_virtual
{
public:
      virtual void fun1() const{}
      int    fun2() const { return a; }
private:
      int a;
}

class two_virtual
{
public:
      virtual void fun1() const{}
      virtual int    fun2() const { return a; }
private:
      int a;
}

 

以上三个类中:
no_virtual没有虚函数,sizeof(no_virtual)=4,类no_virtual的长度就是其成员变量整型a的长度;
one_virtual有一个虚函数,sizeof(one_virtual)=8;
two_virtual有两个虚函数,sizeof(two_virtual)=8; 有一个虚函数和两个虚函数的类的长度没有区别,其实它们的长度就是no_virtual的长度加一个void指针的长度,它反映出,如果有一个或多个虚函数,编译器在这个结构中插入一个指针( V P T R)。在one_virtual 和two_virtual之间没有区别。这是因为V P T R指向一个存放地址的表,只需要一个指针,因为所有虚函数地址都包含在这个表中。

关于 如何sizeof(类)
空类
:1
没有虚函数:sizeof(数据成员)的和
有虚函数:sizeof(数据成员)的和+sizeof(V表指针)=4

 

2、若类中包含成员,则类对象的大小只包括其中非静态成员经过对齐所占的空间,对齐方式和结构体相同。如:

class A
{
public:
int b;
float c;
char d;
};

sizeof(A)是12.

class A
{
public:
static int a;
int b;
float c;
char d;
};
sizeof(A)是12.

class A
{
public:
static int a;
int b;
float c;
char d;
int add(int x,int y)
{
return x+y;
}
};
sizeof(A)也是12.

 

 

posted on 2013-09-17 22:19  风言枫语  阅读(1784)  评论(0编辑  收藏  举报