为什么 C 中成员函数指针是 16 字节?
扫描二维码
随时随地手机看文章
Pushes and pops on the stack are always in 8-byte strides, and pointers are 8 bytes wide.从 CPU 的角度来看,指针无非就是内存的地址,所有的内存地址在 x86_64 平台下都是由 64 位来表示,所以假设它是 8 个字节是正确的。通过简单输出不同类型指针的长度,这也不难验证我们所说的。
int main() {
std::cout <<
"sizeof(int*) == " << sizeof(int*) << "\n"
"sizeof(double*) == " << sizeof(double*) << "\n"
"sizeof(void(*)()) == " << sizeof(void(*)()) << std::endl;
} 编译运行上面的程序,从结果中可以看出所有的指针的长度都是 8 个字节:
x86_64
$ g -Wall ./example.cc
$ ./a.out
sizeof(int*) == 8
sizeof(double*) == 8
sizeof(void(*)()) == 8 然而在 C 中还有一种特例——成员函数的指针。很有意思吧,成员函数指针是其它任何指针长度的两倍。这可以通过下面简单的程序来验证,输出的结果是 “16”:
struct Foo {
void bar() const { }
};
int main() {
std::cout << sizeof(