Data语义学

  1. empty virtual base class subobject大小为1字节。使得其任意对象的地址在内存中都是相同的,一个字节。

古老的编译器没有对virtual base class subobject的优化,这一个字节将会出现在派生类class中。

经过特殊优化的编译器,这个字节不会出现在派生类class中。非empty virtual base class subobject两种情况下一致。

  1. data member的布局

  2. 排列顺序和声明顺序一样。后出现的地址就大些。并不是连续的,因为要内存对齐。

  3. c++标准并不规定基类和派生类数据成员在对象模型中前后位置,但是大部分编译器,基类在前(虚基类是例外g)。

        把一个类分解为两层或更多层,因为内存对齐会导致存储空间膨胀。如:int char char char8个字节。

  1. data member的存取

  2. 类对象大小受三个因素影响

    a、virtual base和virtual function带来的vptr影响 

    b、 EBO (Empty Base class Optimize)空基类优化处理,EBC(Empty Base Class)占用一个字节,其他含有数据成员的从EBC派生的派生类,只会算自己数据成员的大小,不受EBC一字节的影响 

    c、alignment 字节对齐

  3. Nonstatic data members在class object中的排列顺序将和其被声明顺序一样,任何中间介入的static data members都不会被放进布局之中。

  4. 静态成员变量 static data members

    a、存放在程序的data segment之中 

    b、通过指针和对象来存取member,完全一样,不管继承或者是虚拟继承得来,全局也只存在唯一一个实例 

    c、静态常量成员可以在类定义时直接初始化,而 普通静态常量成员只能在.o编译单元的全局范围内初始化

  5. 非静态成员变量 nonstatic data members

    a、 每一个nonstatic data member的偏移量在编译时即可获知 ,不管其有多么复杂的派生,都是一样的。通过对象存取一个nonstatic data member,其效率和存取一个C struct member是一样的。 

    b、从对象存取obj.x和指针存取pt->x有和差异? 

         当继承链中有虚基类时,查找虚基类的成员变量时延迟到了执行期,根据virtual class offset查找到虚基类的部分,    效率稍低 。(成员变量的数据存取并没有this指针的变化)



转载于:https://my.oschina.net/zengjs275/blog/650528

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值