您的位置:首页 > 编程语言 > C语言/C++

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

2016-08-20 15:52 162 查看
一、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处理方式以后补充)

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

X foobar()
{
X xx;
X* px = nex X;

//foo()是一个virtual function
xx.foo();
px->foo();

delete px;
return xx;
}


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

void foobar(X& _result)
{
_result.X::X();

px = _new(sizeof(X));
if(px != 0)
px->X::X();

foo(&_result);
(*px->vtbl[2])(px);

if(px !=0 )
{
(*px->vtbl[1])(px);
_delete(px);
}
return;
}


对象模型影响着代码实际转换过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: