c++ Data语意学

C++的对象模型,有考虑以下几点:

与c语言的兼容

如c的struct的兼容。还有什么呢?

c++语意

  1. c++对象体系主要有以下部分:
    scalarc structclass{(vptrvtbl)/(vbc?)  

    多态用以支持执行期的绑定,OO面向对象范式的编程。
    虚拟继承可以看作是对于多重继承的优化,以节省空间。
  2. static   nonstatic 

    • static data member  可以视作全局变量。独立于class object之外。
    • nonstatic data member  则放置在一块,视为class object之内,存取类似于数组(或struct:要考虑到aligment)。存取效率还是比较高的。
  3. 为了支持virtual function还有virtual base class。这两个需要执行期绑定的特性——两者编译后并不确定具体对象类型(当使用指针或者引用的时候),因此,一个不知道具体引用到了哪个virtual function(存放函数地址),一个不知道具体的基类对象data member的offset。故不宜采用第2点所说的那样。采取的方法一个是vptr+vtbl

    思考:可以比较如下几个。
    a:int a; char b;float * c;
    b: struct A{int a;char b;float * c} cstuct;.
    c: class base {public:char b;};
    class B:public virtual base {int a;float *c;};
    那么引用a、b、c中char b有什么区别?

时间空间效率

  1. alignment 是为了提高运算的效率。可以参考Data alignment及struct size深入分析:Data Alignment 并非针对 Data 本身,而是Data(Variable)的内存地址。几乎所有的programming language。

  2. 在class object直接存放nonstatic data member,而不是存放一个个指针(简单对象模型),用取用的时候直接引用名(di)字(zhi)加上一个固定的offset(对象模型)即可。这样既可以既可以节省空间(存放指针),也可以节省时间(通过指针引用数据:可以类比:数组、链表)。
    ——《深度探索c++对象模型》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值