《深度探索C++对象模型》学习总结(二)——关于对象

封装性质不会带来任何空间或执行器的不良回应,C++在布局以及存取时间上主要的额外负担是由virtual引起,包括:
- virtual function 机制 用以支持一个有效率的“执行期绑定”(runtime binding)
- virtual base class 用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实体”

1.1 C++对象模式

C++中,有两种类成员变量(class data members):静态static和非静态nonstatic
三种类成员函数(class member functions):static、nonstatic和虚函数virtual

简单对象模型

简单模型中,一个对象是一系列的插槽(slots),每个slot指向一个对象。对象们按其声明次序,各被指定一个slot,每一个成员变量或成员函数都有自己的一个slot。
图1.1
在这个简单模型中,成员本身不在对象中,对象中只存放指向对象的指针。这样做可以避免“对象有不同的类型,因而需要不同的存储空间”所招致的问题。

表格驱动对象模型

为了对所有类的所有对象都有一致的表达方式,该对象模型把所有与成员相关的信息抽出来,放在一个成员变量表和成员函数表之中,类对象本身则内含指向这两个表格的指针。成员函数表是一系列的slots,每一个slot指出一个成员函数;成员变量表则直接含有变量本身。
图1.2

C++对象模型

在此模型中,非静态成员变量被配置于每一个类对象内,静态成员变量则被存放在所有的类对象之外。静态和非静态的成员函数也被存放在所有的类对象之外。虚函数则以两个步骤支持之:
1. 每一个类产生出一堆指向虚函数的指针,放在虚函数表(virtual table)中。
2. 每一个类对象被添加了一个指针,指向相关的虚函数表。通常这个指针被称为虚函数表指针(vptr),vptr的设定和重置都由每一个类的构造、析构和拷贝构造运算符自动完成。每一个类所关联的type_info object(用以支持runtime type identification)也经由虚函数表被指出来,通常是放在表格的第一个插槽处。
图1.3
这个模型的主要优点在于它的空间和存取时间的效率;主要缺点则是,如果应用程序代码本身未曾改变,但所用到的类对象的非静态成员变量有所修改(可能是增加、移除或更改),那么那些应用程序代码同样得重新编译,关于这点,前述的双表格模型就提供了较大的弹性,因为它多提供了一层间接性,不过关它也因此付出空间和执行效率两方面的代价就是了。

加上继承

C++最初采用的继承模型并不运用任何间接性:基类子对象的成员变量被直接放置于派生类对象中。这提供了对基类成员最紧凑而且最有效率的存取。缺点是当改变任何基类成员时,都使得所有用到此基类或其派生类的对象需要重新编译。
自C++2.0起新导入的虚基类(virtual base class),需要一些间接的基类表现方法。虚基类的原始模型是在类对象中为每一个有关联的虚基类加上一个指针。其他演化出来的模型则若不是导入一个虚基类表(virtual base class table),就是扩充原已存在的虚表,以便维护每一个虚基类的位置。

对象模型如何影响程序

不同的对象模型,会导致“现有的程序代码必须修改”以及“必须加入新的程序代码”两个结果。

1.2 关键词所带来的差异

为了维护与C之间的兼容性,C++变得更加复杂。

关键词的困扰

主要以class和struct关键词的异同进行介绍。

策略性正确的struct

1.3 对象的差异

C++程序设计模型直接支持三种程序设计典范(programming paradigms):
1.程序模型
2.抽象数据类型模型
3.面向对象模型

多态的主要用途是经由一个共同的接口来影响类型的封装,这个接口通常被定义在一个抽象的基类中。共享接口是以虚函数机制引发的,它可以在执行期根据对象的真正类型解析出到底是哪一个函数实体被调用。

一个指针或引用之所以支持多态,是因为它们并不引发内存中任何“与类型有关的内存委托操作”,会受到改变的只是它们所指向的内存的“大小和内容解释方式”而已。

C++也支持具体的ADT程序风格, 被称为object-based(OB)。OB设计比对等的OO设计速度更快而且空间更紧凑。速度快是因为所有的函数引发操作都在编译时期解析完成,对象建构起来时不需要设置virtual机制;空间紧凑则是因为每一个类对象不需要负担传统上支持virtual机制而需要的额外负荷。不过,OB设计较为没有弹性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值