设为首页 加入收藏

TOP

1.1 C++对象模式(The C++ Object Model)(1)
2013-10-07 14:49:04 来源: 作者: 【 】 浏览:59
Tags:1.1 对象 模式 The Object Model

1.1 C++(www.cppentry.com)对象模式(The C++(www.cppentry.com) Object Model)(1)

在C++(www.cppentry.com)中,有两种class data members:static和nonstatic,以及三种class member functions:static、nonstatic和virtual。已知下面这个class Point声明:

  1. class Point {  
  2. public:  
  3.    Point( float xval );  
  4.    virtual ~Point();  
  5.  
  6.    float x() const;  
  7.    static int PointCount();  
  8.  
  9. protected:  
  10.    virtual ostream&  
  11.       print( ostream &os ) const;  
  12.  
  13.    float _x;  
  14.    static int _point_count;  
  15. }; 

这个class Point在机器中将会被怎么样表现呢?也就是说,我们如何模塑(modeling)出各种data members和function members呢?

简单对象模型(A Simple Object Model)

我们的第一个模型十分简单。它可能是为了尽量减低C++(www.cppentry.com)编译器的设计复杂度而开发出来的,赔上的则是空间和执行期的效率。在这个简单模型中,一个object是一系列的slots,每一个slot指向一个members。Members按其声明顺序,各被指定一个slot。每一个data member或function member都有自己的一个slot。图1.1可以说明这种模型。

 
图1.1  简单对象模型(Simple Object Model)

在这个简单模型下,members本身并不放在object之中。只有"指向member的指针"才放在object内。这么做可以避免"members有不同的类型,因而需要不同的存储空间"所招致的问题。Object中的members是以slot的索引值来寻址的,本例之中_x的索引是6,_point_count的索引是7。一个class object的大小很容易计算出来:"指针大小,乘以class中所声明的members个数"便是。

虽然这个模型并没有被应用于实际产品上,不过关于索引或slot个数的观念,倒是被应用到C++(www.cppentry.com)的"指向成员的指针"(pointer-to-member)观念之中。

表格驱动对象模型(A Table-driven Object Model)

为了对所有classes的所有objects都有一致的表达方式,另一种对象模型是把所有与members相关的信息抽出来,放在一个data member table和一个member function table之中,class object本身则内含指向这两个表格的指针。Member function table是一系列的slots,每一个slot指出一个member function;Data member table则直接持有data本身,如图1.2所示。

 
图1.2  Member Table对象模型(Member Table Object Model)

虽然这个模型也没有实际应用于真正的C++(www.cppentry.com)编译器身上,但member function table 这个观念却成为支持virtual functions的一个有效方案 。

C++(www.cppentry.com) 对象模型(The C++(www.cppentry.com) Object Model)

Stroustrup当初设计(目前仍占有优势)的C++(www.cppentry.com)对象模型是从简单对象模型派生而来的,并对内存空间和存取时间做了优化。在此模型中,Nonstatic data members 被配置于每一个class object之内,static data members则被存放在个别的class object之外。Static和nonstatic function members也被放在个别的class object之外。Virtual functions则以两个步骤支持之:

1.每一个class产生出一堆指向virtual functions的指针,放在表格之中。这个表格被称为virtual table(vtbl)。

2.每一个class object被安插一个指针,指向相关的virtual table。通常这个指针被称为vptr。vptr的设定(setting)和重置(resetting)都由每一个class的constructor、destructor和copy assignment运算符自动完成(我将在第5章讨论这个问题)。每一个class所关联的type_info object(用以支持runtime type identification,RTTI)也经由virtual table被指出来,通常放在表格的第一个slot。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.1 C++对象模式(The C++ Objec.. 下一篇1.2 关键词所带来的差异(A Keywo..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: