深度探索C++对象模型第一章 关于对象

原创 2002年07月01日 14:19:00

C语言中,“数据”和“处理数据的操作”十分开来的。由一组“分布在各个一功能味道想得函数中”的算法所驱动,他们处理的是共同的外部数据。而在C++中,则使用的是独立的“抽象数据类型abstract data type(ADT)”所驱动。从软件工程的角度看“一个ADT或CLASS hierar5chy的数据封装”比"在C程序中程序迎的使用全局数据好"。
加上封装后的布局成本
C++在布局以及存取时间上的额外负担是由Virtual引起,包括:
Virtual function 机制  用以支持一个有效率的执行期绑定"runtime bingding"
Virtual base class  用以实现“多次出现在继承体系中的baseclass,有一个单一而被共享的实体”

1.1  C++ 对象模型 (the c++ object model)
在C++中,有两种class data members : static and nonstatic; 三种class member function :static , nonstatic  and virtual。
而这些内容的安排方法有:
1 简单对象模型
 
为了尽量减低C++编译器的设计复杂度,配上了空间和执行期的效率。一个object 是一系列的slots,每一个slot之想一个member : data member and function slot. 每个data member and function member都有自己的slot. 此模型中,meember 不放在object中,而是存放slot,由slot指向member.
2 表格驱动对象模型
 
此模型中将data member放在一个表中,member function放在一个表中,而class object 本身还有两个表哥的指针.表中的每一个单格存放data member 和member function。
3 C++ 对象模型
 
Nonstatic data members 北方旨在没一个class object中,static data members 放在class object 之外,而static and nonstatic function memebers 放在所有的class object 之外。而Virtual functions一两个步骤完成: 1) 每一个class 产生出一对之想virtual functions的指针,放在virtual table中  2)每一个class object 添加一个指针,指向相关的virtual table. 而VPTR的设定和重置是由constructor ,destructor ,copy constructor完成的。而每一个class 索关联的type_infor也是由virtual table完成的,存放在表格的第一个slot中。
  优点:空间和存取时间的效率;    缺点: 如果应用程序代码本身未曾改变,但是用到的class objects的nonstatic data members有所修改,那么哪些应用程序代码都需要重新编译。

加上继承:
1)简单模型:每一个base class可以被derived class object内的一个slot指出,该slot内涵base class subobject的地址。    缺点:间接性导致了空间和存取时间上的负担, 优点: class object的大小不因base class 而受影响。
2)Base Table 模型。base class table产生出来,表格中的每一个slot内含一个相关的base class地址,很想virtual table内涵一个virtuabl funciton 地址。每个对象含有一个BPTR,指向base class table. 缺点:由于间接性导致了空间和存取时间上的额外负担   优点:每个class object对于继承都有一直的表现方式: 每个class object 都应该在一个固定的位置上安放一个base table指针,与base classes的大小和树木无关,而且不改变class objects的本身的大小。
3) C++的模型: base class subject的data members直接放在derived class object中,提高了存取的效率,却电视每个base class data member改变一下,derived class 就改变了 需要重新编译。而Virtual base class的产生,需要一个间接的base class的表现方法,参看3.4

对象模型如何影响程序:不同的对象模型,会导致现有的程序代码必须修改以及必须加入新的程序代码两种结果。

1.2 关键词所带来的差异
为了支持8种整数的运算,所以C++支持了运算符重载。在C++中,必须保证同一个access section内的数据,以其申明的次序出现在内存布局中,而不同的access sections的存放次序是不定的。同样,base class 和derived class的布局次序也是没有规定的。

1.3  对象的差异
C++支持的三种programming paradigms:
1)程序模型:类似于C语言  2)抽象数据类型模型:一组抽象的数据和它的相应表达式 3)面向对象模型:彼此相关的类型,通过一个抽象的base class被封装起来。
C++一下列的方法支持多态:
1)经由异族硬汉的转化操作,将derived class object的地址赋给base class pointer  : shapre *ps = new circle();
2)经由virtual function机制: ps->ritate();
3)经由dynamic_case 和 typeid运算符:  if (circle * pc= dynamic_case <circle *> (ps) )   ...

需要多少的内存才能表现一个class object: 1) 其nonstatic data members的大小  2)alignment的需求 3) Virtual funciton and Virtual base class的额外负担

指针的类型:每个指针的大小是一样的,但是有“指向不同类型之各指针“间的区别,每个指针只能覆盖其指向对象的内存范围。

[读书笔记] 深入探索C++对象模型-第一章《关于对象》

最新在看深入探索C++对象模型(Inside C++ object model),看的同时针对一些之前没有留意或者理解不深的内容整理一下读书笔记,方便之后复习,也希望可以帮助到有同样疑惑的人。 下面是...
  • beyongwang
  • beyongwang
  • 2016年08月21日 21:14
  • 583

深度探索c++对象模型

所谓知己知彼,百战不殆。只有深入了解了c++对象的内存布局,我们才能更熟练运用c++这门语言。 运行环境vs2013一单继承和多继承的结合class C { public: C() :c(1...
  • db199410
  • db199410
  • 2016年06月16日 17:40
  • 372

深度探索c++对象模型(一)_关于对象

原博客地址:http://www.roading.org//develop/cpp/c对象面面观.html 学习C++应该看过不少关于C与C++的口水贴,以及关于各种对比C与C++效率比较的...
  • A_IIIIIIIII_A
  • A_IIIIIIIII_A
  • 2016年01月04日 11:31
  • 510

《深度探索C++对象模型》读书笔记——关于对象【for_wind】

//整理之,分享之,欢迎指正。for_wind 1、C与C++的区别:       概括来说,C程序中程序性地使用全局数据[注1]。而C++采用ADT(abstract data tpye)或...
  • for_wind
  • for_wind
  • 2014年03月28日 14:08
  • 1383

《深度探索c++对象模型》读书笔记(一)

本文以下内容为深度探索c++对象模型的笔记 深度探索c++对象模型是Stanley B Lippman的著作,对c++进行了较深层次的探讨。于我而言,这本书解答了我多年(半年)的疑惑: 虚函数是怎...
  • cover_s
  • cover_s
  • 2016年08月30日 15:51
  • 560

《深度探索C++对象模型》读书笔记(一)

Lippman早期在贝尔实验室,和C++发明者Bjarne Stroustrup设计了全世界第一套C++编译器cfront,还著有经典的C++入门书[Ensential C++](https://bo...
  • Draco_mystack
  • Draco_mystack
  • 2017年04月18日 22:43
  • 157

《深度探索C++对象模型》:Data语意学

《深度探索C++对象模型》:Data语意学
  • hujingshuang
  • hujingshuang
  • 2016年10月21日 11:34
  • 877

《深度探索C++对象模型》(一)对象模型、存储形式;默认构造函数一定会构造么?

一)、读后感     在我参加工作两年多的时候,工作不算很忙了,《深入理解C++对象模型》开始进入我的视野;或许是因为我要从Symbian.C++ 转向iOS Objective-C,并开始思考语言本...
  • hherima
  • hherima
  • 2013年05月11日 23:02
  • 4185

《深入探索C++对象模型》第三章奇怪语句解释

在第三章的3.3节有下面这样一段描述: class Point3d { private: float x; private: float y; static const int ch...
  • wang1902568721
  • wang1902568721
  • 2016年06月29日 19:38
  • 217

【深度探索C++对象模型】第一章 关于对象

一起阅读经典:深度探索C++对象模型。
  • qqYang123456789
  • qqYang123456789
  • 2014年06月14日 23:45
  • 899
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度探索C++对象模型第一章 关于对象
举报原因:
原因补充:

(最多只允许输入30个字)