码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-08-20 17:37:34      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

一、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 }

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

 

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

标签:

原文地址:http://www.cnblogs.com/linux-hp/p/5790601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!