标签:
一、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 }
对象模型影响着代码实际转换过程。
标签:
原文地址:http://www.cnblogs.com/linux-hp/p/5790601.html