【有书共读】《深度探索C++对象模型》01

  
【有书共读】《深度探索C 对象模型》01
关于对象
加上封装以后的布局成本没有增加,c 在布局以及存取时间上的额外负担是由virtual引起的,包括:virtual function机制  用以支持一个有效率的“执行期绑定”(“runtime binding”)

virtual base class 用以实现“多次出现在继承体系中的base class 和其第二或后继之base class的转换”之间。然而,一般而言,并没有什么天生理由说c 程序一定比其c兄弟庞大或迟缓。

C 对象模型:简单说就是非静态数据成员放在每个 class 的内部,静态数据成员、静态或非静态函数放在类的外部;虚函数机制的支持是在每个 class 内部维护一个 vptr 指向 vtbl,vtbl 存放所有虚函数指针。 vptr 的设定和重置都由每一个 class 的构造函数、析构函数和拷贝构造/赋值函数自动完成。每一个 class 的 typeinfo 也放在 vtbl 之中(用来支持 RTTI),vtbl 中还有 virtual base class  subobject 的 offset 值。

C 中尽量不要对 class 使用柔性数组,因为如果该 class 有多个访问权限,或者从另一个 class 派生而来,或者定义有多个 virtual function,可能不能顺利转化。C 中处于同一访问权限的数据必然依声明次序出现在内存布局中,放置在不同访问权限中数据的先后就不一定了;同样的道理,基类和派生类数据成员的布局以及 vptr 的位置也为该伎俩打上一个问号(实际上目前编译器 vptr 一般位于头部,基类数据在派生类数据成员之前,所以后两点视编译器而定吧)。所以要避免使用柔性数组,避免覆盖。

主要有三种方法支持多态:(1)基类使用引用或指针接收派生类。(2)可调用虚函数触发多态。(3)经由 dynamic_cast 和 tyepid 运算符。
class 的大小由三点决定:(1)其非静态数据成员的大小。(2)内存对齐。(3)为支持 virtual 产生的额外负担(无非是 vptr 和 virtual base class suboject)
  当一个 基类对象被直接初始化为(或是被指定为)一个派生类对象时,派生类对象就会被切割,仅剩基类类型大小的内存。多态不再呈现,而一个严格的编译器可以在编译时期解析一个 ”通过该对象而触发的虚函数“ 调用操作(编译器够严格,解析出发生了切割,就不采用多态了),因而回避 virtual 机制。如果虚函数被定义为 inline,此时一个非虚函数 inline 导致效率更高
#C++工程师#
全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务