sizeof计算含有虚函数的类的空间大小

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sizeof计算含有虚函数的类的空间大小

当我们计算一种数据类型所占用的空间大小时,很easy,sizeof就可以解决掉。如果我们计算一个类,一个空类,或者一个含有虚函数然后又派生子类时,这时候他们所占用的内存空间是如何变化的呢?下面我们就通过代码来介绍下。

一个不含有虚函数的普通类与其派生类的内存关系

class Base

{

public:

Base(int x):a(x)

{}

void print()

{

cout<

}

private:

int a;

};

class Derived:public Base

{

public:

Derived(int x):Base(x-1),b(x){}

void print(){};

private:

int b;

};

此时Base类和Derived类的内存空间是怎样的呢?

Sizeof(Base) 和sizeof(Derived)

1.对于Base类

Base类中含有一个整型成员变量,sizeof(int) = 4,print()函数不占用内存。所以Base类占用的内存空间大小为4字节

2.对于Derived类

Derived类继承于Base类,自然的继承了其成员变量a,自身又扩展了自己的成员变量b,因而多了4个字节。所以Derived类所占用的内存空间大小应该为8字节。

一个含有虚函数的类与其派生类的内存空间占用关系

class A

{

public:

A(int x):a(x){}

virtual void print(){cout<

private:

int a;

};

class B:public A

{

public:

B(int x):A(x-1),b(x){}

virtual void print(){cout<

private:

int b;

};

此时Base类和Derived类的内存空间是怎样的呢?

Sizeof(A )和sizeof(B)

1.对于类A

类A中不仅有一个成员变量还有一个虚函数,因为虚函数需要一个指针去维护这个类的虚函数表,普通函数是不占用内存的。

在32位系统中,一个指针的字节大小是4字节,但是在64位Ubuntu系统中一个指针的大小是8个字节。此段代码是在64位系统下测试的。所以类A所占用的内存大小为4+8 =12?这看起来是很容易的数学题,但是这真的对吗?答案很清晰,这明显是错的!为什么呢?因为这里面有对齐和补齐的因素。12不能满足是8的倍数。所以需要补齐4字节。因此此类的内存空间大小是16字节。如果是32位系统则sizeof(A)=8,64位系统是sizeof(A)=16

2.对于类B

类B中继承了A的成员变量,自身也扩展了成员变量b,因为有个虚函数,所以需要虚函数表额指针去维护。4+4+8 = 16字节。(64系统)

32位系统sizeof(B)=4+4+4 =12

64位系统sizeof(B)=4+4+8=16

●空类的内存空间

Class A

{

};

Sizeof(A)=1

由于Ashi空类,编译器会安插一个char空类,标记它的每一个对象,因此其大小为1字节。

●更多请前往个人文库

/p/helpylee

相关文档
最新文档