第一章 关于对象

来源:互联网 发布:vb.net数据库放到内存 编辑:程序博客网 时间:2024/05/16 23:38

1.加上封装后的布局成本

不同函数没有增加成本。

额外负担是由virtual引起的。

virtual function

virtual base class

1.1c++对象模型

class data member:static, nostatic

class member functions:static, nostatic, virtual

 

class Point{

public:

    Point(float xval);

    virtual ~Point();

    float x() const;

    static int PointCount();

protected:

    virtual ostream& print(ostream &os) const;

    float _x;

    static int _point_count;

}

 

简单对象模型

一个object是一系列的slots,每一个slot指向一个members。Members按其声明次序,各被指定一个slot。每一个data member或function member都有自己的一个slot。

 

 

Point pt

--------------------------------------

|                                      *-----|-------------------------->Point::Point(float)

--------------------------------------

|                                      *-----|-------------------------->Point::~Point()

--------------------------------------

|                                      *-----|-------------------------->float Point::x()

--------------------------------------

|                                      *-----|-------------------------->int Point::PointCount()

--------------------------------------

 

|                                      *-----|-------------------------->ostream& Point::print(ostream&);

 

--------------------------------------

|                                      *-----|-------------------------->float Point::_x

--------------------------------------

|                                      *-----|-------------------------->int Point::_point_count

--------------------------------------

 

 

 

 

 

表格驱动对象模型

将members抽出来,放在一个data member table和一个member function table之中,class object本身则内含指向这两个表格的指针

 

 

Point pt

                                                                                                            member data table

--------------------------------------                                                             -----------------------

|                                      *-----|---------------------------------------------->|       _x               |

--------------------------------------               ---------------------------            -----------------------

|                                      *-----|--------->|                               |             |    _point_count  |

--------------------------------------               ---------------------------             -----------------------

                                                               |                               |

                                                               ---------------------------

                                                               member function table

 

 

c++对象模型

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的设定和重置都由每一个class的constructor,destructor和copy assignment运算符自动完成。每一个class所关联的type_info object(用于支持runtime type identification,RTTI)也经由virtual table被指出来,通常是放在表格的第一个slot处。

 

 

 

 

1.2关键词所带来的差异

1.3对象差异

1.程序模型

2.抽象数据类型模型

3.面向对象模型

内存大小:

nonstatic data members的总和大小

由于alignment的需求而填补上去的空间。

加上为了支持virtual而由内部产生的任何额外负担

 

“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。

 

Bear b;

zooAnimal *pz = &b

Bear *pb = &b;

它们都指向Bear object的第一个byte,差别:pb所涵盖的地址包含整个Bear object,而pz所涵盖的地址只包含Bear object中的zooAnimal subobject。

除了ZooAnimal subobject中出现的members,你不能够使用pz来直接处理bear的任何members。唯一例外是通过virtual机制

 

pz的类型将在编译器决定一下两点:

固定的可用接口

该接口的Access level

对于virtual function,类型信息并不是维护与pz之中,而是维护于link之中,此link存在于object的vptr和vptr所指之virtual table之间。

 

 

 

 

 

 

 

 

原创粉丝点击