《inside the c++ object model》读书笔记 之一:对象

关于对象


...引子:在C语言中,"数据"和"处理数据的操作(函数)"是分开来声明的,语言本身并没有支持"数据和函数"之间关联性,这种程序成为"程序性的",由一组"分布在各个一功能为向导的函数中"的算法驱动,他们处理的是共同的外部数据.

...C++在布局以及存取时间上的主要额外负担是有virtual引起的,包括:
  1)virtual function 机制,用以实现一个有效率的"执行期绑定"
  2)virtual base class 用以实现"多次出现在继承体系中的 base class,有一个单一而被共享的实体"


1.对象模式:

1.1对象模式:
...C++中,有两种class data members:static和nonstatic,以及三种class member functions:static,nonstatic和virtual,一共有三类C++对象模型:简单对象模型,表格驱动对象模型,C++物件对象模型.
  1)简单对象模型:在此模型中一个object是由一系列的slots组成,每一个slot指向一个member,每个data member或是function member都有一个自己的slot
  2)表格驱动模型:在此模型中,有两个指针,一个指向data member table,另一个指向member function table,在这项两个标志中存放着一系列slots,每一个slot指向一个data member或是一个function member.
  3)C++物件对象模型:在此模型中,nonstatic data members被配置于每一个class object之内,static data members则被存放在所有的class object之外,static和nonstatic functions也被存放在所有的class object之外,virtual functions则有以下两个步骤支持:
    a)每一个class产生出一堆指向virtual functions的指针,放在表格之中,这个表格被称为virtual table(vtbl).
    b)每一个class object被添加了一个指针,指向相关的virtual table,通常这个指针被称为vptr,vptr的设定和重置都有每一个class constructor,destructor和copy assignment运算符自动完成,每个vtbl的第一个slot一般都是指向type_info object.

...加上继承:
  C++最初采用的继承模型并不运用任何间接行:base class subobject的data members直接被置于derived class object中,在C++2.0以后才导入的virtual base class需要一些间接的base class表现方法.virtual base class的原始模型在class object之中为每一个关联的virtual base class 加上一个指针,其他演化出来的模型则导入一个virtual base class table或者扩充已存在的virtual table来维护virtual base class的位置.


1.2关键词struct:
..."struct那个关键词,其实没什么用"(Bell Lab)

...C++中凡是处于同一个access section的数据,必定保证以其声明次序出现在内存布局中,然而被放置在多个access sections中的数据,排列次序就不一定有规定的顺序.

...C struct在C++中的一个合理用途是,当你要传递"一个复杂的class object的全部或是部分"到某个C函数中去时,struct的声明可以将数据封装起来,并保证拥有与C兼容的空间布局,然而这项保证只在组合(composition)的情况下才存在,如果是继承而不是组合在不行,因为编译器会决定是否要有额外的data members被安插到base struct subobject之中.


1.3对象的差异:
...C++程序设计模型直接支持三种programming paradigms(程序设计典范):
  1)程序模型:就像C一样.
  2)抽象数据类型模型:该模型所谓的"抽象"是和一组表达式(public接口)一起提供,而其运算符定义仍然隐而未明.
  3)面向对象模型:在此模型中有一些彼此相关的类型,通过一个抽象的base class(用以提供共通接口)被封装起来.

...C++用下列方法来支持多态:
  1)经由一组隐含的转化操作.
  2)经由virtual function机制.
  3)经由dynamic_cast和typeid运算符.
注:一般只有通过pointers或是references的间接处理,才能支持面向对象程序设计所需的多态.

...要表现一个class object需要多少内存?
  1)其nonstatic data members的总和大小.
  2)加上任何由于alignmennt的需求而填补的空间.(alignment就是将数值调整到某数的倍数,一般32位计算机上通产alignment为4bytes)
  3)加上为了支持virtual而由内部产生的任何额外负担.

...指针类型:"指向不同类型的个指针"在内存上均是一个地址,无任何差异,其不同之处在于其所寻址出来的objec类型不同,也就是说,"指针类型"会教导编译器如何解释摸个特定地址中的内存内容以及其大小.

...关于多态:
  当一个base clas直接被初始化为一个derived class object时,derived object就会被切割(sliced),以塞入较小的base type内存中,于是derived将没有留下任何痕迹,多态将不再出现.C++通过pointer或是reference来支持多态,这种程序设计风格成为"面向对象".

posted on 2012-04-23 14:59  碎雨  阅读(1304)  评论(0编辑  收藏  举报

导航