抛砖引玉篇--Data member

时间:2024-04-11 14:30:21

/ --*-- 2018.7.27 --*-- /

 

摘要:论述了c++对象模型中的data-member内存布局

          包括data-member的类型存储位置存取方式

 

% data-member

  从数据的存储方式看,data-member可以分为:

  static data-membernonstatic 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

 

% 对于简单的单继承

抛砖引玉篇--Data member

为什么可以用base class指针指向(或引用)derived class object?

:由上图可知,base class 和derived class的object所在内存空间的首地址相同,

   期间差异只在于,derived object更大,用于存储自己的nonstatic member。

  (可在运行时实现,不需要编译器的修改)

 

% 多重继承的情况:

  当一个继承自多个基类的时候,

  基类对象与派生类对象的内存空间就不一定是从同一位置开始了,

  应该加上相应的位置偏移量。

抛砖引玉篇--Data member

抛砖引玉篇--Data member

抛砖引玉篇--Data member

抛砖引玉篇--Data member

抛砖引玉篇--Data member

 

测试用例及结果:

抛砖引玉篇--Data member

抛砖引玉篇--Data member

抛砖引玉篇--Data member

抛砖引玉篇--Data member

 

参考书籍:《Inside The Cpp Object Mordel》