深入探索C++对象模型笔记一 —— 关于对象(上)

本文对比了C语言和C++的编程方式,并深入探讨了C++中的对象模型,包括虚拟函数机制、虚基类以及多重继承等特性带来的布局成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

开篇就面向过程的C语言的体系进行了讲解,在C语言中,“数据”和“操作(函数)”是分开声明的。言本身没有支持“数据和函数”之间的关联性。

 

在C++中,使用的是“抽象数据类型(ADT)”或“类层次的数据封装”。从软件工程的角度来看,C++威力更大。

 

C++加上封装后的布局成本:

c++在布局以及存取时间上主要的额外负担是由virtual引起的。包括:

 

 

  •  Virtual function 机制 。用以支持一个有效率的“执行期绑定”(runtime binding)。 
  •  Virtual base class。用以实现“多次出现在继承体系中的base class,有一个单一而共享的实体”。 

此外,还有一些多重继承下的额外负担。发生在“一个derived class和其第二或后继之base class的转换”之间。

 

 

C++对象模式:

在C++中,有两种class data members : static 和 nonstatic

 

              有三种class member functions: static 、nonstatic 和 virtual

 

提出了几种模型原型:简单对象模型,表格驱动对象模型。

 

C++对象模型:

  • nonstatic data members 被配置与每一个 class object 之内,static data members 则被存放在所有的 class object之外
  • static 和 nonstatic function members 也被放在所有的 class object 之外
  • virtual function 则以两个步骤支持:      

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

    (2)每一个 class object 被添加了一个指针,指向相关的 virtual table,通常这个指针被称为 vptr。(vptr的设定和重置都由每一个 class 的 constructor、destructor 和 copy assignment 运算符自动完成。)

模型主要优点:空间和存取时间的效率

模型主要缺点:如果应用程序代码本身未曾改变,但所用到的class objects的nonstatic data members有所修改(可能是增加,移除或更改),那么那些应用程序代码同样得重新编译。(相对双表格模型来说,双表格模型提供了较大的弹性,因为它多提供了一层间接性,但是它因此也付出空间和执行效率两方面的代价)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值