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产生的额外负担。