下面用程序测试与类的内存布局相关的东西。
看仔细看下面程序,建议自己动手运行:
#include<iostream>
using namespacestd;
class A{
};
class B{
public:
void shw(){}
};
class C{
public:
virtual void show(){}
};
class D:publicC{
public:
virtual void show1(){}
virtual void show2(){}
};
class E{
public:
virtual void show1(){}
virtual void show2(){}
};
void main() {
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;
cout<<sizeof(C)<<endl;
cout<<sizeof(D)<<endl;
cout<<sizeof(E)<<endl;
A a;
cout<<sizeof(a)<<endl;
C c1,c2;
D d1;
printf("%p\n",c1.show);//输出成员函数的入口地址
printf("%p\n",c2.show);
printf("%p\n",d1.show);
}
以下是在我的电脑上的运行结果:
分析以上的输出结果可以得出:
l 声明无成员变量的类,仅占用一个字节的内存空间;
l 含有虚函数而无成员变量的类仅占用四个字节空间,这四个字节空间存储的是虚函数表的入口地址
l 类的成员函数(不管虚实函数)在内存中只有一份,继承也是一样的,不会产生函数的副本;
l 对于虚函数,类要保存虚函数表的入口地址。对于继承来得虚函数只是在继承类的虚函数表中保存父类中该函数的地址(这点可以从最后两个输出说明);