成员函数的指针长度

class A{
};
class C : public virtual A{
public:
 void f1() {}
};
猜猜 &C::f1 函数指针的大小是多少?

int _tmain(int argc,_TCHAR *argv[])

{

  printf("%d",sizeof(&C::f1));

  return 0;

}

显示 12

    --君君

是要写这么个功能发现的:将所有的函数用个void*存起来,后面再拿出来调用,会出错,发现void*不够存上面那个指针大小

  --滔滔

原因

http://bbs.gimoo.net/thread/214108-1.html

在32位win7操作系统中,一般函数指针的长度为4个字节(32位),而类的成员函数指针的长度随类的定义与否、类的继承种类和关系而变,从无继承关系类(Test3)的4字节(32位)到有虚继承关系类(Virtual Inheritance)(Test4)的12字节(96位),仅有说明(declaration)没有定义的类(Test)因为与其有关的一些信息不明确成员函数指针最长为16字节(128位)。显然, 与一般函数指针不同,指向“类”的成员函数的指针不仅包含成员函数地址的信息,而且包含与类的属性有关的信息,因此,一般函数指针和类的成员函数指针是根本不同的两种类型,当然,也就不能用一般函数指针直接调用类的成员函数

他要放额外的东西实现虚继承 动态的this

struct pmf_type1{
void* vcall_addr; // 成员函数的地址
};
struct pmf_type2{
void* vcall_addr; // 编译器生成的函数的地址
int delta; // 调整this指针用
};

原文地址:https://www.cnblogs.com/minggoddess/p/2251207.html