第一章 关于对象

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之间。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值