Inside The C++ Object Model学习笔记

P6 +3 C++在布局以及存储事件上主要的额外负担是由virtual引起,包括virtual function机制和virtual base class。此外还有一些多重继承下的额外负担。

P6 -4 C++中有两种class data member: static和nonstatic,以及三种class member functions:static、nonstatic和virtual。

P9 +3 C++对象模型:nonstatic data members被配置于每一个class object之内,static data members被存放在所有的class object之外。static和nonstatic function members也被放在所有的class object之外。virtual functions则以两个步骤支持之:1.每个class产生出一堆virtual functions的指针,放在virtual table中。2.每一个class object被添加一个指向相关virtual table的指针。其setting和resetting都有每一个class的constructor、deconstructor和copy assignment运算符自动完成。每一个class所关联的type_info object(用以支持RTTI)也经由virtual table被指出,通常放在表的第一个slot处。

P11 +2 在虚拟继承的情况下,base class不管在继承串链中被派生多少次,永远只会存在一个实体。

P12 +6 C++的继承模型:base class subobject的data members被直接放置于derived class object中。virtual base class的模型是在class object中导入一个virtual base class table或扩充原来已存在的virtual tables,以便维护每一个virtual base class的位置。

P20 -7 对应于C中的变长结构体技巧的class版本

class stumble {

  public:

  protected:

    // protected stuff

  private:

    char pc[1];

};

C++中凡处于同一个access section的数据保证以其声明次序出现在内存布局中。然而放置在多个access sections中的各笔数据,排列次序就不一定了。base

classes和derived classes的data members的布局也没有谁先谁后的强制规定。virtual functions的存在也会使前面的技巧的有效性成为一个问号。

P21 -3 C struct在C++中的一个合理用途,是当你要传递“一个复杂的class object的全部或部分”到某个C函数中去时,struct声明可以将数据封装起来,并保证拥有与C兼容的空间布局。然而仅限于组合,继承不可以。

P22 +4 C++支持三种程序设计典范: procedural、 adt(ob)和oo。oo典范中,程序员需要处理一个未知实体,它的类型虽然有所界定,却有无穷可能。这组类型受限于其继承体系,然而该体系理论上没有深度和广度的限制。原则上,被指定的object的真实类型在每一个特定执行点之前,是无法解析的。在C++中,只有通过pointers和references的操作才能够完成。相反地,在adt典范中程序员处理的是一个拥有固定而单一类型的实体,它在编译时期就已经完全定义好了。

P25 -3 C++以下列方法支持多态:1.经由一组隐含的转换操作。基类指针。2.经由virtual function机制。3.经由dynamic_cast和typeid运算符。

P27 +6 C++需要多少内存才能够表现一个class object? 其nonstatic data members的总和大小 + 任何由于alignment的需求而填补上去的空间 + 为了支持virtual产生的额外负担。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值