sizeof计算含有虚函数的类的空间大小
当我们计算一种数据类型所占用的空间大小时,很easy,sizeof就可以解决掉。
如果我们计算一个类,一个空类,或者一个含有虚函数然后又派生子类时,这时候他们所占用的内存空间是如何变化的呢?下面我们就通过代码来介绍下。
一个不含有虚函数的普通类与其派生类的内存关系
class Base
{
public:
Base(int x):a(x)
{}
void print()
{
cout<<a<<endl;
}
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<<a<<endl;}
private:
int a;
};
class B:public A
{
public:
B(int x):A(x-1),b(x){}
virtual void print(){cout<<b<<endl;}
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。