《深度学习C++对象模型》学习笔记1:关于对象

关于对象

1.1 C++对象模式

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

         1virtual function机制:用以实现一个有效率的“执行期绑定”;

         2virtual base class:实现“多次出现在继承体系中的base class,有一个单一而被共享的实体”;

         3)多重继承下,发生在“一个派生类和其第二个或者后继之基类的转换”之间。

一般而言,并没有什么天生的理由说C++程序一定比其C兄弟庞大或迟缓。


2.在C++中,有两种数据成员:static 和 nonstatic,以及三种成员函数:static,nonstatic和virtual。


3.C++对象模型

    C++对象模型是从简单对象模型派生而来,并对内存空间和存取时间做了优化。

    在此模型中,nonstatic的数据成员被置于类对象之内,而static数据成员被置于类对象之外。staticnonstatic成员函数被放在类对象之外。virtual函数则以两个步骤支持:1)每个class产生一个vtbl(virtual table),存放一堆指向虚函数的指针2)每一个类对象被添加一个指向vtbl的指针vptr。而vptr的设定和重置由类的构造函数、析构函数以及copy assignment运算符自动完成。


4.在虚拟继承的情况下,基类不管被派生多少级,永远只会存在一个实体(称为subobject)。虚拟(virtual,也就是共享的意思)。

1.2 关键词带来的差异 

1. C++中凡处于同一个access section的数据,必定保证以声明次序出现在内存布局中,然而被放在多个access sections中的各笔数据排列次序就不一定了。同样,base classesderived classesdata members的布局也没有谁先谁后的强制规定。

1.3 对象的差异

1.C++程序设计模型直接支持三种programming paradigms(程序设计典范):

         1)程序模型(procedural model)

         2)抽象数据类型(abstract data type model,ADT)

         3)面向对象模型(object-oriented model)


2.虽然可以直接或间接处理继承体系中的一个base class object,但只有通过pointerreference的间接处理,才能支持OO程序设计所需的多态性质。


3. C++中,多态只存在于public class体系中。nonpublic的派生行为以及类型为void*的指针可以说是多态,但它们没有被语言明白地支持,必须由程序员通过显示的转型操作来管理。


4.C++以下列方法支持多态:

         1)经由一组隐含的转化操作,如吧一个derived class指针转化为一个指向其public base type的指针;

         2)经由virtual function 机制;

         3)经由dynamic_cast和typeid运算符。


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


6.需要多少内存才能够表现一个class object?

         1)其nonstatic data members的总和大小;

         2)加上任何由于alignment(就是将数值调整到某数的倍数。在32计算机上,通常alignment为4bytes,即32位,以使bus的“运输量”达到最高效率)的需求而填补上去的空间;

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


7.一个指针,不管它指向哪一种数据类型,指针本身所需的内存大小是固定的。


8.指向不同类型之指针的差异,既不在其指针表示法不同,也不在其内容不同,而是在其所寻址出来的object类型不同,亦即指针类型会教导编译器如何解释某个特定地址中的内存内容及大小。它们之所以支持多态,是因为它们并不引发内存中任何与类型有关的内存委托操作,会受到改变的只是它们所指向的内存的大小和内容的解释方式。


9.转型cast操作其实是一种编译指令,大部分情况下它并不改变一个指针所含的真正地址,它只是影响被指向之内存的大小和内容的解释方式。


10.一个base class object被直接初始化或指定为一个derived object时,derived object就会被切割sliced,以塞入较小的base type内存中,多态于是不再呈现。一个严格的编译器可以在编译时期解析一个通过该object而触发的virtual function调用操作,从而回避virtual机制。这时,如果virtual function被定义为inline,则会有效率上的收获。


11.C++通过class的pointers和references来支持多态,这种程序设计风格称为“面向对象”。一个pointer或一个reference之所以支持多态,是因为它们并不引发内存中任何“与类型有关的内存委托操作”;会收到改变的只是它们所指向的内存的“大小和内容解释方式”而已。

C++也支持具体的ADT程序风格,如今被称为object-based(OB).



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值