/ --*-- 2018.7.27 --*-- /
摘要:论述了c++对象模型中的data-member内存布局,
包括data-member的类型、存储位置、存取方式。
% data-member
从数据的存储方式看,data-member可以分为:
static data-member和nonstatic data-member。
@1.nonstatic data-member存储在class object所在的内存空间。
@2.static data-member存储在data segment,相当于global data,只是作用域仅限于该class。
且在内存中只有一份实体,是所有class object的共享资源。
note:##1.nonstatic data-member必须通过class object才能调用。
##2.static data-member还可以直接通过class作用域调用,
因为static data-member相当于全局变量,在class object创建之前已经初始化完毕。
(利用c++的封装特性,一般会通过静态函数操作静态成员,而不是直接暴露数据)
% data-member的内存布局
@1.对于同一access section(public、protected、private)的data-member,
要求申明较晚的存储在class object中的较高位 置。
@2.各data-member之间不一定是连续存放,由于数据的对齐方式,
data-member的alignment(边界调整),需要填补字节。
@3.为了支持对象模型,编译器会自动增加一些内部data-member,
例如对于有virtual function-member的class object会有一个vptr。
% 对于简单的单继承
为什么可以用base class指针指向(或引用)derived class object?
:由上图可知,base class 和derived class的object所在内存空间的首地址相同,
期间差异只在于,derived object更大,用于存储自己的nonstatic member。
(可在运行时实现,不需要编译器的修改)
% 多重继承的情况:
当一个继承自多个基类的时候,
基类对象与派生类对象的内存空间就不一定是从同一位置开始了,
应该加上相应的位置偏移量。
测试用例及结果:
参考书籍:《Inside The Cpp Object Mordel》