读书笔记-深度探索C++对象模型-Chapter4
2013-03-25 22:01
267 查看
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); //1为vtbl 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。
为了支持virtual function机制,必须首先能够对多态对象有某种形式的“执行期类型判断法 runtime type resolution”。
即ptr->z();中需要知道ptr的确切类型。
什么时候需要向class添加runtime type相关信息,添加什么样的信息:
当这个类有virtual function的时候。需要一个表示class的类型的信息和指向vtbl的指针。
一个class只有一个vtbl,其中的函数包括:自己定义的虚函数;从父类继承来的未被override的虚函数;纯虚函数;
单一继承下的virtual function:
多重继承下的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)
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); //1为vtbl 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。
为了支持virtual function机制,必须首先能够对多态对象有某种形式的“执行期类型判断法 runtime type resolution”。
即ptr->z();中需要知道ptr的确切类型。
什么时候需要向class添加runtime type相关信息,添加什么样的信息:
当这个类有virtual function的时候。需要一个表示class的类型的信息和指向vtbl的指针。
一个class只有一个vtbl,其中的函数包括:自己定义的虚函数;从父类继承来的未被override的虚函数;纯虚函数;
单一继承下的virtual function:
多重继承下的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)
相关文章推荐
- 深度探索c++对象模型 学习笔记 chapter2-1 default constructor
- 深度探索c++对象模型-阅读笔记
- 深度探索C++对象模型 Data语意学笔记
- 深度探索c++对象模型学习笔记
- 深度探索C++对象模型之C++对象模型笔记
- 深度探索C++对象模型学习笔记——Function语意学
- 深度探索C++对象模型 关于对象的笔记
- 深度探索C++对象模型 Function语意学笔记
- 深度探索c++对象模型前4章读后感
- 深度探索C++对象模型 第五章 构造、析构、拷贝语意学
- 【C++】深度探索C++对象模型之Function语意学
- 深度搜索C++对象模型笔记
- 深度探索C++对象模型(5)
- 深度探索C++对象模型——构造函数
- 【深度探索c++对象模型】Function语义学之虚函数
- 深度探索C++ 对象模型【第一章2】
- 深度探索 C++对象模型——读书笔记
- 深度探索C++对象模型----data member的存取
- 深入探索C++对象模型笔记一 —— 关于对象(上)
- 深度探索C++对象模型--Function语意学