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

来源:互联网 发布:ubuntu 17.10 ibus 编辑:程序博客网 时间:2024/05/17 18:14
//整理之,分享之,欢迎指正。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”上。

参考资料及推荐资料:
  1. 深度探索C++对象模型

0 0