Data Member布局

  • 同一个Access Section(private, public等)中,data member的顺序按照声明顺序排列,但是没有规定需要连续排序。同时编译器可能会安插一些内部的data member(比如vptr),用来支持整个对象模型。
  • 不同Access Section中,member的排列顺序由编译器决定。

Data Member存取

-X是空基类,需要安插一个char,使得class的两个objects在内存上拥有唯一的地址;
-Size(A) = 4(为了支持virtual base class而额外增加的指针) + 1(base class本身) + 3(Alignment对齐) = 8
-Size(C) = 4(A) + 4(B) + 1(X,虚拟继承被A/B所共享) + 3(对齐) = 12

class X {};    //空虚基类          sizeof(X) = 1
class A: public virtual X {};   //sizeof(A) = 8
class B: public virtual X {};   //sizeof(B) = 8
class C: public A, public B {}; //sizeof(C) = 12
  • Static Data Members
    -直接存放于Data Segment,拥有唯一实体,不存在于class object中;
    -如果两个class声明了同名static members,编译器会对class中static data member名字进行修饰,使其独一无二;
    -对static data member取址,得到该member数据类型指针;nonstatic data member取址将得到该member在类中偏移。

  • Nonstatic Data Members
    -对nonstatic data member的存取需要在class object起始地址加上该member的偏移。

class A {public: int x; int y;};
A a;
a.y = 0;  //&a.y = &a + &A::y

Data Member和继承

  • 只有继承没有多态
    -base class subobject会在derived class中保持原样。
  • 有多态
    在很多版本编译器中vptr放在class前端。
    对于单一继承,其base class 和derived class的object都是从相同的地址开始的,其差别只是在于derived object比较大。
  • 多重继承和虚拟继承

总结:多继承,单继承都不会导致访问时间的增加,但是虚拟基类由于使用间接访问技术,会导致访问时间的增加。

深度探索C++对象模型-Data语义学相关推荐

  1. 深度探索C++对象模型第2章 构造函数语义学

    默认构造函数 两个误区: 1 任何class如果没有定义默认构造函数,就会被合成一个出来:只有在某些情况下被合成 2 编译器合成出来的默认构造函数会明确设定class中每一个数据成员的默认值 :默认值 ...

  2. 第2章构造函数语义学读书笔记——深度探索c++对象模型

    深度探索c++对象模型 第2章 构造函数语义学 2.1 Default Constructor的构建操作 2.2 Copy Constructor的构造操作 2.3 程序转化语义学 2.4 成员的初始 ...

  3. 深度探索C++ 对象模型(6)-Data member的存取

    nonstatic data member 需要在class object起始地址加上该member的偏移. class A {public: int x; int y;}; A a; a.y = 0 ...

  4. 深度探索C++ 对象模型(6)-Data member的绑定

    防御性程序设计 1).将class声明起头处放data member; 代码示例: class Point3d{ float x,y,z; public://etc } 2). class的声明处放i ...

  5. 深度探索C++ 对象模型(7)-Data member的布局(虚继承)

    虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

  6. 深度探索C++ 对象模型(7)-Data member的布局(多重继承)

    多重继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

  7. 深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)

    无继承 继承无多态 继承多态 虚表 : 用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI). 每个class object导入一个vptr,提供执行期的链接,使得每一个class ...

  8. 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学

     <深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...

  9. 深度探索C++ 对象模型(4)-Default Copy Constructor(2)

    没有Default Constructor, class Myclass{ public://... private:int a;char *str; }; 编译器执行的是"位逐次拷贝(Bi ...

  10. 深度探索C++ 对象模型(3)-默认构造函数Default Constructor

    1. Default Constructor只对base class subobjects和member class objects初始化,对data member不做操作 2. 编译器构造Defau ...

最新文章

  1. 第八章 路由协议原理
  2. Confluence 6 用户目录图例 - 连接 Jira 和 Jira 连接 LDAP
  3. linux编译libevent
  4. Linux下显示当前目录下的全部目录或文件
  5. linux通过spi和stm32通信,双STM32通过SPI进行通信
  6. php变量教学,PHP变量详解
  7. dev c++ 代码补全_学习干货——玩转DEV—C++
  8. 我所理解的领域驱动模型设计
  9. 【认证课程】NP理论复习之IS-IS
  10. Kaldi的英文缩写
  11. SQL Server Management Studio –分步安装指南
  12. linux 下拉式 终端,Gnome桌面的下拉式终端: Guake
  13. 小米8青春版解BL锁教程申请BootLoader解锁教程
  14. kettle使用httpClient获取ES索引数据
  15. python中的 zip函数详解
  16. 【2000字原创】大厂都在用的几款软件测试平台!
  17. PROFINET转EtherNet/IP网关连接罗克韦尔(AB) PLC配置案例
  18. 第三方支付原理与概述
  19. layout_weight如何计算比例?
  20. 谭浩强c 语言程序设计

热门文章

  1. NetXray使用说明之(6)----捕捉oicq message报文
  2. 构建一套完整高效的供应链系统体系
  3. 文献翻译——基于关联规则挖掘识别的鸡源大肠杆菌共有多重耐药模式(下)
  4. 利用Github服务器做一个软件自动升级系统
  5. css下拉菜单代码(用纯css实现下拉菜单)
  6. 十六进制转float
  7. linux支持hd610显卡吗,奔腾G4560核显怎么样且HD610相当于什么级别的显卡?
  8. PPLIVE加速器导致无法正常上网
  9. 玩qq游戏提示计算机内存不足,win10系统玩游戏提示“计算机内存不足”怎么办...
  10. linux磁盘刻录ISO工具,技术|Ubuntu下的三个好用的CD/DVD刻录工具