C++11类的内存分布:
目的:辅助了解 C++面向的对象的继承和多态。
实验平台:win10+vs2013
首先是创建一个win32的C++项目,右键->属性,C++选项,命令,添加一条命令:
/d1reportAllClassLayout 查看所有相关类的内存分布;
/d2reportSingleClassLayoutXXX(XXX为类名)
查看指定类XXX的内存分布。
在vs编译器中,可以看到:
类对象的内存分布中,
如果类中包含虚函数
1.虚表指针放在对象内存偏移0处
2.成员变量根据在类中的声明顺序依次排列。
3.成员函数不占用内存。
4.静态数据成员也不占用对象的内存。
5.如果是子类,先排布基类成员,然后再排列子类的数据成员。
在虚继承的情况下,会产生2个vfptr指针和1个vbptr指针。
第一个vfptr指针指向子类的虚表
第二个vfptr指针指向虚基类的虚表
vbptr指针的作用就是 子类虚表指针和虚基类虚表指针的衔接指针。
为什么需要虚继承?因为C++多继承中,若果不虚继承,基类内部定义的内容会有2份,这样在子类的子类调用基类的函数或者变量时会出现无法明确内容的错误,在编译时就会提示错误。
虚继承也是为共享基类给子类对象使用。
虚继承的作用是减少了基类的重复,代价是增加了虚表指针的负担,就是非虚继承,也会增加虚表指针的负担。
每个包含虚函数的类都有虚表指针和虚表;
如果不是虚继承,子类将父类的虚表指针继承下来,并且指向自身的虚表(在构造子类对象时);
子类里面有多少个虚函数,虚表里面就有多少个虚函数项。多重继承时,会有多份基类的虚表和虚指针。
若果是虚继承,子类会有两份指针,一份指向自己的虚表,一份指向虚基类。多重继承时虚基表和虚基表指针只有一份。
