c++中的函数指针(假定在64位机器上)
我们知道指针的大小恒定的,跟机器位数有关,32位机下,指针是4字节大小,64位机下指针是8字节大小.但是在C++中,有一个比较特殊的地方是C++的类成员函数 指针,它的大小是普通指针的2倍.先看一个实例:
void foo(void)
{
}
class A{
public:
void foo(){}
}
int main()
{
void (*pfun)(void);
pfun = foo;
void (A::*pMfun)(void);
pMfun = &A::foo;
std::cout<<"normal function pointer size:"<<sizeof(pfun)<<std::endl;
std::cout<<"member function pointer size:"<<sizeof(pMfun)<<std::endl;
return 0;
}
运行结果:
normal function pointer size:8
member function pointer size:16
证明完毕.下面解释为什么会这样.
this指针的调整
再看一个例子:
class A{
public;
void foo()
{
//假设我们需要在这里去使用数组a
std::cout<<"addr of this:%x"<<this<<std::endl;
}
private:
int a[4];
};
class B{
public:
void bar()
{
//假设我们需要在这里去使用数组b
std::cout<<"addr of this:%x"<<this<<std::endl;
}
prviate:
int b[4];
};
class C: public A,B{
};
int main()
{
C c;
c.foo();
c.bar();
return 0;
}
结果
addr of this:%x0x7ffd30f4ec00
addr of this:%x0x7ffd30f4ec10
这时候可以看到,传递给foo和bar函数的this指针是不一样的?为什么会不一样呢? 考虑一下函数中的注释. 所以调用类成员函数指针时,就需要将this指针进行调整,这个调整的信息在哪里?就在这个函数指针中,所以就需要另外的空间去存放这些信息,这也就是为什么类成员函数指针是16字节的原因,因为多出来的8字节,用于编译期的this指针调整.