《深度探索C++对象模型》--1 关于对象

1、封装成本

C比较,在virtual没有参与的情况下,C++的封装没有增加成本。C++在布局以及存取时间上的主要而外负担是由virtual引起的。包括:virtual function机制和virtual base class

2C++对象模式

C++中,有两种class data membersstaticnonstatic,以及三种class member functionsstaticnonstaticvirtual

1)简单对象模型

一个object是一系列的slots,每一个slots指向一个members

2)表格驱动对象模型

将所有与members相关的信息抽出来,放在一个data member table和一个member function table中,class object内含指向这两个表格的指针。

3C++对象模型

Nonstatic data members被配置于每一个class object之内,static data members被存放在个别的class object之外;static function members也被放在个别的class object之外。而virtual functions 则:

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

b)每一个class object 被安插一个指针,指向相关的virtual table。这个指针称为vptrvptr的设定和重置都由每一个classconstructordestructorcopy assignment运算符自动完成。每一个class 所关联的type_info object也经由virtual table指出。

3、关键词所带来的差异

1structclass

struct关键词实现了C的数据抽象概念,class关键词实现C++ADTabstract data type)观念。structclass关键词不会造成什么差别,真正特性是由声明(publicprivateprotected)本身决定的。

2C++凡处于同一个accesssection的数据,必定保证以其声明次序出现在内存布局中,然而被放置在多个accesssections中的各笔数据,排列次序就不一定了。这与C中按照声明顺序分配空间不同。

3)如果迫切需要一个相当复杂的C++ class的某部分数据,使它拥有c声明的那种样子,那么那一部分最好抽取出来成为一个独立的struct声明。利用组合,而非继承。

C structC++中的一个合理用途,是当你要传递一个复杂的classobject 的全部或部分到某个C函数中去时,struct的声明可以将数据封装起来,并保证拥有与C兼容的空间布局,然而这项保证只在组合的情况下才存在,如果是继承而非组合,编译器会决定是否应该有额外的datamembers 被安插到 basestruct subobject之中。

4、对象的差异

C++程序设计模型直接支持三种programming paradigms(程序设计范式)。

1)程序模型(proceduralmodel)。

C一样的处理过程。

2)抽象数据类型模型(abstract data type modelADT)。

所谓抽象是和一组表达式一起提供的,那时其运算定义仍然隐而未明。如===

3)面向对象模型(object-orientedmodel)。

只有通过pointerreference的间接处理,才支持OO程序设计所需的多态性质。

一个 pointer或一个reference之所以支持多态,是因为它们并不引发内存中任何“与类型有关的内存委托操作(type-dependentcommitment)”;会受到改变的只是它们所指向的内存的“大小和内容解释方式”而已;当一个base classobject被直接初始化为(或是被指定为)一个derivedclass object时,derivedobject就会被切割,以塞入较小的base type内存中,多态于是不再呈现。

5、需要多少内存才能表现一个classobject

1nonstatic data members的总和大小。

2加上任何由于alignment的需求而填补上去的空间(可能存在与members之间,也可能存在与集合体边界)。

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

一个指针(或是一个reference,本质上一个reference通常是以一个指针来实现的),不管它指向哪种数据类型,指针本身所需的内存大小是固定的。一个机器地址,即机器字长,如32位机器是4bytes

6、需要理解的知识点:

1C++对象模型

有两个概念可以解释:(1)语言中直接支持面向对象程序设计的部分。(2)对于各种支持的底层实现机制。本书针对第二个概念。

2)面向对象与基于对象的区别

面向对象的三大特点(封装,继承,多态)却一不可,通常基于对象使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说基于对象没有继承的特点,而多态是表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论多态。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。当判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。面向对象基于对象都实现了封装的概念,但是面向对象实现了继承和多态,而基于对象没有实现这些。

3)虚拟继承

为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。

class 派生类名:virtual 继承方式  基类名
virtual
是关键字,声明该基类为派生类的虚基类。
在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用。声明了虚基类之后,虚基类在进一步派生过程中始终和派生类一起,维护同一个基类子对象的拷贝。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值