读书笔记深度探索C++对象模型Chapter4

Chapter 4 Function语义学 The Semantics of Function

Member的各种调用方式:

nonstatic member functions

nonstatic member functions会被转化为nonmember形式。

传入this指针,function中对nonstatic data member的存取都使用this来访问。

virtual member function

如果normalize()virtual member function,则

ptr-> normalize()会变成

(*ptr->vptr[1])(ptr); //1vtbl slot的索引值,关联到normalize

static member function

static member function将会被转换为一般的nonmember函数调用。

obj.norm()ptr->norm()都会变为 norm_7Point3dSFv();

虚拟成员函数 virtual member function

基本实现模型:每个object都有virtual table,内含该class之中所有的virtual function地址,每个object含有一个vptr指向这个vtbl

 

 vf

为了支持virtual function机制,必须首先能够对多态对象有某种形式的“执行期类型判断法 runtime type resolution”。

ptr->z();中需要知道ptr的确切类型。

什么时候需要向class添加runtime type相关信息,添加什么样的信息:

当这个类有virtual function的时候。需要一个表示class的类型的信息和指向vtbl的指针。

 一个class只有一个vtbl,其中的函数包括:自己定义的虚函数;从父类继承来的未被override的虚函数;纯虚函数;

单一继承下的virtual function

 

 vtbl

多重继承下的virtual function

多重继承下涉及到this指针的调整。

class C : public A,B...

A *a = &abc;

B *b = &abc;

a或者b调用虚函数时,需要将abc转为合适的this指针。

于是vtbl中的虚函数需要知道自己对应的this指针(Bjarne原来方法是将this指针的信息(offset)记录在vtbl中)。

另外的解决方案是thunk技术。

thunk是一小段assembly代码,形如

pbase2_dtor_thunk:

   this += sizeof(base1);

   Derived::~Derived(this);

thunk技术允许vtbl slot中只含一个指针(指向virtual function(不需要调整this指针时)或者thunk(需要调整this指针时))。

虚继承下的virtual function

不明白(书上没写明白: ...编译器对virtual base class的支持简直就像进了迷宫一样...不适合在此处讨论...我的建议是不要在virtual base class中声明nonstatic data members)。

函数的效能

指向member function的指针

取一个nonstatic member function的地址,得到这个函数的实现在内存中的位置(当然,调用时需要一个对象)。

使用“指向member function的指针”调用虚函数,仍能够支持虚函数机制:&Point::z();返回的不是内存地址,而是slot索引值。

Inline Function和形参(Formal Arguaments

原文地址:https://www.cnblogs.com/apprentice89/p/2981565.html