标签:作用 rto rgba rup add soft virt int 情况下
1.指向作用域运算符(书里叫成员选择运算符)"::"的指针的作用是保存this指针。所以静态成员函数指针(没有this)的类型是函数指针,而不是成员函数的指针。
2.指向成员函数的指针有两种功能:①调用普通的成员函数②调用虚成员函数
对前者取地址得到的是该函数在内存中的真实地址,而后者取地址得到的是虚函数在虚函数表中的索引值。所以一个成员函数指针必须能分辨指向的是上述哪两种地址,在cfront2.0中的解决办法如下:
float (Point::*pmf)(); Point *ptr; //判断是哪种情况 (((int)pmf) &~127) //pmf如果是索引且最大索引小于127则被置为0 ? (*pmf)(ptr) // 非虚函数 : (*ptr->vptr[(int)pmf](ptr)); //虚函数
上述判断需要一定的开销。
3.多重继承和虚拟继承情况下的指向成员函数的指针
(1)Stroustrup提出了以下结构来支持多重继承和虚拟继承的成员函数指针。
struct _mptr{ int delata //表示可能的this指针调整值 int index; //虚函数表的索引值,-1表示非虚函数 union { ptrtofunc faddr; //非虚函数的地址 int v_offset; //放置第二个或后继继承链中虚基类的虚函数表的位置,如果vptr放在类对象的开头处则不必要但是会降低对C结构的兼容性 };};
此模型下需要改正2中所提到的判断。这个判断会导致指向非虚函数的指针也增加判断这一条件,并且当传递一个不变指针给成员函数时,他需要产生一个临时对象(因为要配置上述这个结构体,普通情况下直接产生一个临时指针即可)
(pmf.index<0) ?(*pmf.faddr)(ptr) //非虚函数 :(*ptr->vptr[pmf.index](ptr)); //虚函数
(2)为了减少对指向非虚成员函数指针判断所带来的成本,Microsoft取消判断,导入一个vcall thunk。此策略下,faddr被指定要不就是真正的member function地址,要不就是vcall thunk地址。vcall thunk会选出并调用相关virtual table中的slot。
标签:作用 rto rgba rup add soft virt int 情况下
原文地址:https://www.cnblogs.com/wildricky/p/14926377.html