C++对象内存分布

来源:互联网 发布:SQL未提交行1中的数据 编辑:程序博客网 时间:2024/05/20 00:16

1,没有父类,没有虚函数。完全和结构体内存分布相同,顺序按照各个成员的声明顺序,需要考虑内存对齐(PS:不同编译器的对齐策略部相同,所以一个dll中声明的对象在外面未必可用,因为类成员访问本质是按照偏移量访问,不同内存对齐方式会导致偏移量不同,解决方法是所有dll产生的对象的访问都应该交由dll导出的函数处理)。空间大小为各个成员的大小之和。

2,没有父类,有虚函数。第一个成员为虚表地址,下面的内存分布和1相同。空间大小为各个成员大小之和加4。

3,一个父类,父类有虚函数。顺序依次是虚表地址,父类成员,类成员。空间大小为父类大小加上类成员大小。

4,一个父类,父类没有虚函数,类有虚函数。顺序依次是虚表,父类成员,类成员。空间大小为父类大小之和加上类成员大小加上4。

5,一个父类,父类没有虚函数,类没有虚函数。顺序依次是父类成员,类成员。空间大小为父类大小加上类成员大小。

6,多个父类,存在父类有虚函数。顺序依次是虚表地址,父类1成员(父类1本身有虚函数),有虚函数的父类,没有虚函数的父类,类成员。父类的分布规则是由虚函数的父类在前面,没有虚函数的父类在后面,同等类比父类(有虚函数和没有虚函数)安装声明顺序分布。空间大小为各个父类大小加上类成员大小。

7,多个父类,父类都没有虚函数,类有虚函数。顺序依次是虚表地址,各个父类成员(按照声明顺序),类成员。空间大小为各个父类大小之和加上类成员大小加上4。

8,多个父类,父类都没有虚函数,类没有有虚函数。顺序依次是各个父类成员(按照声明顺序),类成员。空间大小为各个父类大小之和加上类成员大小。

原创粉丝点击