《深度探索c++对象模型》 学习笔记 - 1 关于对象

 

1.         C++在布局和存取时间上的主要的额外负担是由virtual引起的,包括:1virtual function机制,用以实现一个有效率的“执行期绑定”;2virtual base class,实现“多次出现在继承体系中的base class,有一个单一而被共享的实体”;3)多重继承下,发生在“一个派生类和其第二个或者后继之基类的转换”之间。

2.         有两种数据成员staticnonstatic,以及三种成员函数staticnonstaticvirtualC++对象模型对内存空间和存取时间做了优化,nonstatic的数据成员被置于类对象之内,而static数据成员被置于类对象之外。staticnonstatic成员函数被放在类对象之外。而virtual函数是由如下步骤支持:1)每个class产生一个vtbl(虚函数表)。Vtbl中包括其类的类型type_info信息和虚函数指针;2)对象内添加一个指向vtbl的指针vptr。而vptr的设定和重置由类的构造函数、析构函数以及copy assignment运算符自动完成。

3.         虚拟继承即“共享”之意,其基类不论被派生多少级,永远只存在一个实体(subobject)。

4.         Structclass几乎完全一样,除了默认的访问权限外。所以以class定义也可以用struct声明,只是warning而已。

5.         类中处于同一个access section中的数据,必定保证以其声明次序出现在内存布局中。但是,不同的access section中的各个数据,其排列次序则没有规定。同理,基类和派生类的数据成员布局也没有要求谁先谁后的强制规定。但是,一般说来,普通继承都是基类在前,子类在后;virtual继承,则是virtual 基类在最后面,其他的在前面。

6.         C++程序支持3种编程模型:1)过程model,像c一样;2)抽象数据类型模型(ADT),只有封装,没有继承和多态;3)面向对象模型(OO),典型的支持继承、封装和多态。ADT也叫OBobject-based),它的速度更快(所有的内容都是编译器确定,没有运行期的决策)且空间更紧凑(没有为virtual而增加的额外支出),只是缺少一些弹性。

7.         OO中,被指定的对象的真实类型在特定的执行点前是无法解析的(因为多态),所以只有通过pointer或者reference操作才能完成(如果是对象的话,会被slice)。而ADT处理的是一个固定且单一类型的实体,在编译期已定。

8.         C++中支持多态的方法:子类对象基类指针、引用;虚函数;dynamic_cast或者typeid运算符。

9.         总体说,一个object的内存大小含:非静态数据成员;alignment造成的padding;支持virtual而产生的额外负担。

10.     指针(引用也是由指针实现的)的类型只是告诉编译器:如何解释特定地址上的内存及其大小。而cast(转型)只是一种编译器指令,大部分情况下不会改变一个指针的真正地址,只是影响“目标内存的大小和内容”的解释方式。

11.     一个指针或者引用之所以支持多态,是因为他们并不引发内存中任何“与类型有关的内存委托操作(type-depended commitment)”。受到影响的只是“目标内存的大小和内容”的解释方式。而基类对象被初始化为子类对象,其子类对象的信息就会被slice,以塞入较小的基类内存中,而派生类型没有在基类对象中留下任何的信息,包括vptr

 

 

下面的代码是在学习过程中随便写的,错误和不严谨之处很多;甚至有一些地方只是做了一些记录和随笔。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值