对象——深度探索C++对象模型读书笔记(1)

起源
在C语言中,数据和函数是分开声明的,这意味着语言本身不支持数据和函数之间的关联性,因而C语言也被称为面向过程的语言(procedural),即数据由一组算法所驱动,这一组算法处理的是共同的外部数据(对算法而言,数据是通过参数进行传递的,所以是外部数据)。
而在C++中,类似的操作可采用抽象数据类型(ADT)的方式实现。
小知识:书中p4使用const重载函数,与未使用const的区别在于编译器会根据调用对象是否为const进行判断,若为const对象则传递const this指针调用const修饰的函数,否责调用未用const修饰的函数。
C++封装的成本
与C struct一样,data members直接内含在每一个对象之中。
而data functions虽然出现在声明中,但并不出现在对象中,即不占用对象空间。每一个non-inline member function只会诞生一个函数实例,每一个inline member function只有在被使用时才会产生对应的函数实例(当使用者很多时,就会有多个实例了)。
C++在布局和存取时间上的开销主要是由virtual引起的。
C++中的virtual
virtual function机制:用以支持“执行期绑定”(runtime binding)。
virtual base class:解决棱形继承问题。
C++中的class data members:分为static和nonstatic两种。
C++中的class member functions:static、nonstatic和virtual三种。
对象模型:分为简单对象模型,表格驱动对象模型,C++对象模型。参见p7。
struct取代class的情况:如果用struct让你感觉比较舒服,那就用吧。就像模板里面typename和class一样(但不支持struct,因为templates并不打算与C兼容),随你高兴。
C与C++中data members的内存分布差异
C中按struct声明顺序分布。
C++中:
1、同一access section中的数据保证以其声明顺序出现在内存布局中。而不同access section中的相对顺序是不确定的。
2、base classes和derived classes的data members的布局也没有强制的顺序规定,具体取决于编译器的实现。
3、virtual functions也会影响数据的内存分布。
所以不要将C中内存布局的技巧套用到C++中。
组合而非继承是将C和C++结合起来的唯一可行方法,书中给出使用这种技巧的场合是“你需要传递一个复杂的class object的全部或部分”到某个C函数去时,struct声明可以将数据封装起来,并保证拥有与C兼容的空间布局(仅限组合的情况下)。
C++中的程序设计范式(paradigms):面向过程、面向对象、抽象数据类型(Effective C++中分为4种,传统的C、面向对象、面向过程、STL,但显然C是一种面向过程的语言,STL是ADT的具体实现)。
class object的内存
nonstatic data members的总和大小。
加上任何由于对齐(alignment)的需求而填充(padding)的空间(可能存在于members之间,也可能存在于边界)。
为了支持virtual而产生的额外负担(虚函数中的vptr,虚继承中的父类空间)。
指针或引用:用于实现间接手法,本质上引用通过指针来实现。
指针类型:用于教导编译器如何解释某个特定地址中的内存内容及其大小。
转换(cast):是一种编译器指令,大部分情况下不改变指针所含的真正地址,只影响内存大小和内容的解释方式。
面向对象:C++通过类的指针或引用来支持多态,称为面向对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值