第1章 关于对象
C++在布局以及存取时间上的主要的额外负担是由virtual引起的,包括
- virtual function机制:用以支持一个有效率的执行期绑定
- virtual base class:用以实现多次出现在继承体系中的base class有一个单一而被共享的实体
C++对象模式
C++对象模型
- nonstatic data members被配置于每一个class object之内
- static data members则被存放在所有的class object之外
- static和nonstatic function members被放在所有的class object之外
- virtual functions以两个步骤支持之
- 每一个class产生出一堆指向virtual functions的指针,放在表格之中,这个表格被称为virtual table(vtbl)
- 每一个class object被添加了一个指针(vptr),指向相关的virtual table
加上继承
C++支持单一继承,也支持多重继承;继承关系也可以指定为虚拟(virtual共享)
虚拟继承的情况下,base class不管在继承串链中被派生多少次,永远只会存在一个实体。
对象的差异
C++以下列方法支持多态
经由一组隐含的转化操作,例如把一个derived class指针转化为一个指向其public base type的指针
1shape *ps = new circle();经由virtual function机制
1ps->rotate();经由dynamic_cast和typeid运算符
多态的主要用途是经由一个共同的接口来影响类型的封装,这个接口通常被定义在一个抽象的base class中。共享接口是以virtual function机制引发的,它可以在执行期间根据object的真正类型解析出到底是哪一个函数实体被调用。
需要多少内存才能够表示一个class object?
- 其nonstatic data members的总和大小
- 加上任何由于alignment的需求而填补上去的空间
- 加上为了支持virtual而由内部产生的任何额外overhead
一个指针,不管它指向哪一种数据类型,指针本身所需的内存大小是固定的。
一个派生类指针和一个基类指针(指向同一个对象)有什么不同?
它们每个都指向对象的第一个Byte。其间的差别是,派生类指针所涵盖的地址包含整个对象,而基类指针所涵盖的地址只包含对象中的子对象。除了子对象中出现的成员,不能够使用基类指针直接处理派生类的任何成员,唯一例外是virtual机制。
第2章 构造函数语意学
成员的初始化队伍
编译器会一一操作initialization list,以适当次序在constructor之内安插初始化操作,并且在任何也explicit user code之前。
list中的项目次序是由class中的members声明次序决定,不是由initialization list中的排列次序决定。
第3章 Data语意学
|
|
一个空的class事实上并不是空的,由一个隐晦的1byte,被编译器安插进去的一个char,这使得这个class的两个objects得以在内存中配置独一无二的地址
Y和Z的大小收到三个因素的影响
语言本身所造成的overhead
在derived class中,这个overhead反应在某种形式的指针身上,它或者指向virtual base class subobject,或者指向一个相关表格;表格中存放的若不是virtual base class subobject的地址,就是其偏移量。
编译器对于特殊情况所提供的优化处理
alignment的限制
static data members被放置在程序的一个global data segment中,不会影响个别的class object的大小。在程序之中,不管该class被产生出多少个objects,static data members永远只存在一份实体。
Data Member的布局
nonstatic data members在class object中的排列顺序将和其被声明的顺序一样,任何中间介入的static data members都不会被放进对象布局中。
Static Data Members
每一个static data member只有一个实体,存放在程序的data segment之中。
Nonstatic Data Members
nonstatic data members直接存放在每一个class object之中。
继承与Data Member
继承和多态
把vptr放在class object的前端,对于“在多重继承之下,通过指向class members的指针条用virutal function”会带来一些帮助。