C++主要是参考《深度探索C++对象模型》这本书来复习的,这本书把C++对象模型讲解的非常透彻,之前也阅读过了《C++ Primer》和《Effective C++》,后面两本书也讲的很好。 下面主要是《深度探索C++对象模型》中的笔记。
member functions虽然在class的声明之内,但却不会出现在object之中,每一个non-inline member function 只会诞生一个函数实例。至于每一个“拥有零个或一个定义”的inline function 则会在其每一个使用者身上产生一个函数实例。
C++在布局以及存取时间上的主要额外负担是由virtual引起的,包括:
1. virtual function机制 ,用于支持一个有效率的“执行期绑定(runtime binding)”。
2. virtual base class ,用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实例” 。
C++有两种class data members:static和非static。
三种class member functions:static,non-static,virtual。
对于object的多态操作,要求此object必须经由一个pointer 或者reference来存取。
需要多少内存才能够表现一个class object,一般而言主要有:
1. 其non-static data members的总和大小
2. 加上任由由于alignment 的需求而填补上去的空间,可能存于members之间,也可能存于集合体边界。
3. 加上为了支持virtual 而由内部产生的任何额外负担
有4种情况,会造成“编译器”必须为未声明construct的class合成一个default construct:
1. 类里面存在member object时
2. 类存在继承体系,base class的default construct
3. 类里面存在virtual function 时
4. 类继承体系中出现virtual base class时
有3种情况会以一个object的内容作为另一个object的初值:
1. 以一个object显式地初始化操作
2. 当object当做参数传递给某一个函数
3. 函数返回object
一个class object可用两种方式复制得到,一种是被初始化(copy construct) ,另外一种是被指定(assignment) 。
什么时候一个class不会呈现出一种“bitwise copy semantics” 呢?有4种情况:
1. 当class内含一个member objct,而后者的class声明有一个copy constructor(不论是被class设计者显式地声明,或者是被编译器合成)。
2. 当class继承自一个base class ,而后者存在一个copy constructor
3. 当类声明一个或多个virtual functions 时
4. 当class 派生自一个继承串链,其中有一个或多个virtual base classes 时
编译器间的两个程序扩张操作(只要有一个类声明了一个或多个virtual functions就会如此) :
1. 增加一个virtual function table (vtbl) ,内含每一个有用的virtual function 的地址
2. 一个指向virtual function table 的指针(vptr),安插在每一个class object内
当class object以“相同class的另一个object”作为初始,其内是以所谓的default memberwise initialization手法完成的,也就是把每一个内