《深度探索C++对象模型》读书笔记——Function 语意学【for_wind】

//整理之,分享之,欢迎指正。for_wind

1、nonstatic member functions

其至少和一般的nonmember function 有相同的效率。编译器内部已将“member函数实体”转换为对等“nonmemer函数实体”。
转换步骤:
  • 改写函数原型(signature),以安插额外参数this指针
  • 改由this指针存取nonstatic data member;
  • name mangling处理函数名称成独一的外部函数名,以及进行name return value的优化

2、virtual member functions

调用的两种方式:
1)经由一个class object调用一个virtual function,编译器将其视为一般的nonstatic member function进行resolved。
2) 经由指针或引用调用,通过vptr,指向virtual table,通过其内的索引值,关联到该虚函数。

执行期多态:
以一个public base class的指针(或引用),寻址出一个derived class object。

具体:
准备工作:安插vptr指向该表格;给每一个virtual function指派一个表格索引值。
执行期任务:在特定的virtual table slot中“激活”virtual function。

一个class只会有一个virtual table。每一个table内含有其对应的class object中 所有active virtual functions函数实体的地址
这些 active virtual functions包括:
(1)这个class 所定义的函数实体,改写(overriding)一个可能存在的base class virtual function函数实体。
(2) 继承base class 的函数实体
(3) pure_virtual_called()函数实体。(表示pure virtual function,或有时当作执行期异常处理函数)

多重继承下的virtual functions

其复杂度在于第二个及后继的base class 身上,以及“必须在执行期调整this指针”。
调整方法:thunk技术,address points技术(微软)

虚拟继承下的virtual functions

建议:不要在一个virtual base class 中申明nonstatic data members。因为太过复杂。

3、static member function

其主要特性: 没有this指针
相关次要特性:
  • 不能够直接存取其class 中的 nonstatic members
  • 不能够被申明为const, volatile 或virtual
  • 不需要经由class object才被调用,虽然经常这样用。
取一个static member function的地址,获得是其在内存中的位置,其地址类型是一个nonmember函数的指针
注:this指针把“在member function存取的nonstatic class member”绑定于“object内对应的member”上。

参考资料及推荐资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值