1.1 C++对象模型
加上了封装之后,布局成本增加了多少?
- 每一个非内联成员函数只会诞生一个函数实例。
- 至于每一个拥有零个或一个定义的内联函数则会在每一个使用者身上产生一个函数实例。
- C++在布局以及存取时间上的主要额外负担是由vitual引起的。
- 虚函数机制:用于支持一个有效率的执行期绑定
- 虚基类机制:用于实现多次出现在继承体系中基类,有一个单一而被共享的实例。
简单对象模型
- 一个对象是一系列的结点,每一个结点指向一个成员。成员按其声明顺序,各被指定一个结点。每一个数据成员和成员函数都有自己的一个结点。
- 成员本身并不放到对象之中,只有指向对象的指针才放到对象内。这么做可以避免成员有不同的类型,因而需要不同的存储空间所招致的问题。
表格驱动对象模型
- 把所有与成员相关的信息抽出来,放在一个data member table 和一个 member function table 之中。类对象本身则内涵指向两个表格的指针。member function table 是一系列的结点,每一个结点指出一个成员函数。data member table 则直接持有data本身。
C++对象模型
- 非静态数据成员被置于每一个类对象之中,静态数据成员则存放在个别类对象之外。
- 静态和非静态成员函数也被放在个别类对象之外。
- 虚函数则以两个步骤支持之:
- 每一个类产生出一堆指向虚函数的指针,放在表格之中,这个表格成为虚表。
- 每一个类对象被安插一个指针,指向相关的虚表。通常这个指针被称为vptr。
- vptr的设定和重置都由每一个class的构造,析构,和拷贝赋值运算符自动完成。
- 每一个类所关联的type_info object(用以支持运行时类型识别)也经由虚表被指出来,通常放在表格的第一个结点。
1.2 关键词所带来的差异
不是重点!!!
不是重点!!!
不是重点!!!
1.3 对象的差异
-
C++程序设计模型直接支持三种programming paradigms(程序设计范式)
- 程序模型:就像C一样,C++当然也支持它。
- 抽象数据类型模型,:此模型所谓的抽象是和一组表达式一起提供的,那时其运算定义仍然隐而为名。
- 面向对象模型:有一些彼此相关的类型,通过一个抽象的基类(用以提供共同接口)被封装起来。
-
虽然对于对象的多态操作要求此对象必须经由一个引用或指针来存取,然而C++中的引用或者指针的处理却不是多态的必要结果。
-
C++中,多态只存在于一个个的public class 体系中。支持多态的方法:
- 经由一组隐式的转化操作
- 经由虚函数机制
- 经由dynamic_cast 和 typeid 运算符。
-
需要多少内存才能够表现一个类对象
- 其非静态数据成员的总和大小
- 加上任何由于译注的需求而填补上去的空间。
- 加上为了支持虚函数而内部产生的任何额外负担。
-
指针的类型:教导编译器如何解释某个特定地址中内存内容及其大小。
-
OO程序设计并不支持对object的直接处理
-
一个引用或者指针之所以支持多态是因为它们并不引发内存中任何与类型有关的内存委托操作;会受到改变的,只有它们所指向的内存的大小和内容解释方式。
-
当一个基类对象被直接初始化为一个派生类对象时,派生类对象就会被切割以塞入较小的基类内存中。