深入探索c++对象模型->1.1c++对象模式

一、c++有三种c++对象模型:

  1、简单对象模型:每个object是一系列的slots,每一个data member或function member(static、virtual、nonstatic)都有自己的一个slot。

  2、表格驱动模型:每个object含有两个指针,这两个指针分别指向data member table和member function table。Member function table是一系列的slots,每一个slot指出一个member function;

Data member table则直接持有data本身。(ps:member function table这个概念为支持virtual functions提供了有力支持)。

  3、C++对象模型:static data members、static和nonstatic function members被放在个别的class object之外;每个nonstatic data members被直接存放于class object之内;至于virtual functions通过以下步骤:每个objec存有一个vptr,vptr指向vtbl,vtbl中存放着一堆指向virtual functions的slots。(ps:每一个class所关联的type_info object也经由virtual table被指出来,通常被放在表格的第一个slot内。、

二、继承关系在对象模型中是如何存在的呢?

  1、简单对象模型:对于每一个base class,被一个内在的slot指出。

  2、表格驱动模型:存在一个base table,内含一系列slots指向base class。

  3、C++对象模型:每一个base class的data members被直接存放于derived class内。(ps:virtual base class处理方式以后补充)

三、对象模型是如何影响程序的?通过以下一个程序及其内部转换来说明:

 1 X foobar()
 2 {
 3     X xx;
 4     X* px = nex X;
 5
 6     //foo()是一个virtual function
 7     xx.foo();
 8     px->foo();
 9
10     delete px;
11     return xx;
12 }

  这段代码实际上被内部转换成:

 1 void foobar(X& _result)
 2 {
 3   _result.X::X();
 4
 5 px = _new(sizeof(X));
 6 if(px != 0)
 7     px->X::X();
 8
 9 foo(&_result);
10 (*px->vtbl[2])(px);
11
12 if(px !=0 )
13 {
14     (*px->vtbl[1])(px);
15     _delete(px);
16 }
17 return;
18 }

对象模型影响着代码实际转换过程。

时间: 2024-07-29 08:06:09

深入探索c++对象模型->1.1c++对象模式的相关文章

深入探索C++对象模型->1.3对象的差异

一.C++程序设计直接支持三种程序设计模式(programming paradigms),程序模型.程序数据类型模型(OB).面向对象模型(OO) 1.程序模型:类似C语言,用过程型语句组成. 2.抽象数据类型模型:所谓抽象就是讲实现和接口分离,显示提供接口,隐藏实现.(PS:不支持虚函数和多态). 3.面向对象模型:通过一个抽象的base class(用以提供共同的接口),将一系列有关联的类型封装起来.通过引用和指针来提供多态. 二.一个Class object共需要多少内存来表示呢? 1.其

读《深度探索C++对象模型》之对象成员的效率

测试平台:华硕N53S(五年前的老机子) 编译环境:VS2010 接下来我将会有多个测试,在多个不同环境下的所消耗的时间比较: 五个测试分别为:个别的局部变量.局部数组.struct之的Public.class 之中的inline Get函数. class之中的inline Get & Set函数: 代码片段如下: struct Point { Point(float mx, float my, float mz) { x = mx; y = my; z = mz; } float x, y,

深度探索C++对象模型(一)——关于对象

引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作者Stanley Lippman总是会有意无意地从编译器的角度来介绍语言的细节:对新手而言,哪里会去关注这样底层的实现呢? 当读到<Inside The C++ Object Model>时,上述感觉愈发强烈,两书之间渐进讲述的细节让人读后大呼过瘾,也深感大师级作者笔触间的睿智. 众所周知,C++

《深度探索c++对象模型》chapter1关于对象对象模型

在c++中,有2种class data member:static和nostatic,以及3钟class member function:static,nostatic和virtual.已知下面这个class Point声明: class Point { public: Point(float xval); virtual ~Point(); float x() const; static int PointCount(); protected: virtual ostream& print(o

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

第一章 关于对象(Object Lessons) -- 本书作者:Stanley B.Lippman 一.前言 什么是 C++ 对象模型:简单的说,就是 C++ 中面向对象的底层实现机制. 本书组织: 第 1 章,关于对象(Object Lessons),介绍 C++ 对象的基础概念,给读者一个粗略的了解. 第 2 章,构造函数语意学(The Semantics of Constructors),构造函数什么时候会被编译器合成?它给我们的程序效率带来了怎样的影响? 第 3 章,Data语意学(T

深度探索C++对象模型的读书心得

参考:深度探索C++对象模型 (stanley B.Lippman著 侯捷翻译) 1. Page9 : C++对象模型,说明每一个类仅有一个虚函数表Vtbl,而类的每一个对象都有指向其表的指针. 2. Page30:引用也需要与一个指针(大小为4BYTE)相同的空间. 3. Page28: 指针类型会教导编译器如何解释某个特定地址中的内存内容及大小. 4. Page39: explicit关键字能够制止"单一参数的constructor被当做一个Conversion运算符" 5. Pa

C# 设计模式之空对象模式

最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象判断是否为空的重复操作,也可以减少异常发生的情况[如果客户端调用程序忘记了检查对象是否为空,而直接访问对象中的数据,则有可能会报出异常,影响程序运行]. 废话不说了,先上我写的代码,下面是未运用空对象模式之前的示例代码: 要返回的实体代码,Person.cs: namespace NullObjec

[读书系列] 深度探索C++对象模型 初读

2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio之类的工具的话,写C++代码感觉要比较费劲,最近重读了这本书后,感觉要写点东西下来(因为懒得用笔作笔记,太慢了-_-!)加深下印象. 以前还是新手的时候,总是认为: 1.class如果没有定义任何constructor的话,编译器会自动合成一个default constructor(我习惯叫缺省的构造函数)出

角色对象模式

意图 单个对象透过不同的角色对象来满足不同客户的不同需求.每一个角色对象针对不同的客户内容来扮演其角色.对象能够动态的管理其角色集合.角色作为独立的对象是的不同的内容能够简单的被分离开来,系统间的配置也变得容易. 译注:为了行文的流畅性及内容意思的准确性,尽量贴近原文使用英文单词标记特定内容, 如Customer表示客户,Client表示客户端,Component表示组件等.因为有各种图例说明,所以在图例说明时,使用原题中的英文单词对应图中内容.有时也中英文交叉使用.因为网页显示的问题,中文黑体