C++对象模型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

深度探索C++对象模型

第一章关于对象

C++对象模型

语言中直接支持面向对象程序设计的部分。对于各种支持的底层实现机制。

第I个概念是一种不变量。例如,c++class的完整virtual function在编译时期就固定下来了,程序员没有办法在执行期动态增加或取代其中的某一个。

对象模型的底层实现机制,在语言层面上是看不出来的—虽然对象模型的语义本身可以使得某些实现品(编译器)比其他实现品更接近自然。C++在布局以及存取时间上主要的额外负担是由virtual引起的

Virtual function机制用以支持一个由效率的“执行期绑定”

Virtual bas class 用以实现“多次出现在继承体系中的base class”有一个单一而被共享的实例。

简单对象模型:

一个object是一系列的slots,每一个slot指向一个members。

表格驱动对象模型:

C++对象模型:

Nonstatic data members被配置于每一个class object之内,static data members则被存放在个别的class object之外。Static和nonstatic function members被放在object之外。

对象的差异

C++程序设计模型直接支持三种programming paradigs:程序模型,抽象数据了类型模型,面向对象模型。

C++以下支持多态:

经由一组隐式的转化操作。

经由virtual function机制。

经由dynamic_cast和typeid运算符。

一个class object的内存:

其nonstatic data members的总和大小。

加上任何由于alignment的需求而填补上去的空间

加上为了支持virtual而由内部产生的任何额外负担。

指针的类型

指向不同类型之各指针间的差异,既不在其指针表示法不同,也不在其内容(代表一个地址)不同,而是在其所寻址出来的object类型不同。指针类型会教导编译器如何解释某个特定地址的内存内容及其大小:

一个指向地址1000的整数指针,在32为机器上,将涵盖地址空间1000~1003。一个指向地址1000而类型为void*的指针,涵盖的地址空间我们无法得知。这就是为什么一个类型为void*的指针只能够持有一个地址,而不能够通过它操作所指之object的缘故。

转换其实是一种编译器指令。大部分情况下它并不改变一个指针所含的真正的地址,它只影响被指出之内存的大小和其内容的解释方式。

多态所造成的一个以上的类型的潜在力量,并不能够实际发挥在“直接存取object”这件事情上。

一个pointer或一个refrence之所以支持多态,是因为它们并不引发内存中任何与类型有关的内存委托操作;会受到改变的,只有它们所指向的内存的“大小和内容解释方式”。

任何企图改变object的大小,会违反其定义中受到契约保护的“资源需求量”

当基类直接初始化给派生类对象时,派生类对象会发生切割。反之会发生溢出。

第二章构造函数语义学

当编译器需要default constructor时会合成它。

对于一个类,如果没有任何user-declared constructor,那么会有一个default construct被隐式声明出来

下面四种情况下implicit default constructor 会被视为nontrivial

带有default construct的member class object

如果一个class没有任何constructor,但它内含一个member object,而后者有default constructor,那么这个class的implicit default constructor就是nontrivial,编译器需要为该class 合成出一个default constructor。不过这个合成操作只有在constructor真正需要被调用时才会发生。

如果一个类内含一个或一个以上的member class objects,那么类的每一个constructor必须调用每一个member class的default construct。编译器会扩张已存在的constructors,在其中安插一些代码,使得user code被执行之前,先调用default constructors。

如果class member objects都要求constructor初始化操作,c++要求以member object在class 中的声明顺序来调用各个constructors。

带有default constructor的base class

带有一个virtual function的class

一个virtual function table会被编译器产生出来,内放class的virtual function地址。

在每一个classobject中,一个额外pointer member会被编译器合成出来内含相关之class vtbl 的地址。

带有一个virtual base class的class

在派生类对象的每一个virtual base classes中安插一个指针完成。所有经由reference或pointer来存取一个virtual base class的操作都可以通过相关指针完成。

Pa->_vbcx->i其中_vbcx表示编译器所产生的指针,指向virtual base class。Implicit trivial default constructor实际上并不会被合成出来。

相关文档
最新文档