Pointer to Member
数据成员指针存储的是偏移
#include <iostream>
using namespace std;
struct Foo {
int x;
int y;
};
int main() {
Foo x{2};
int Foo::* px = &Foo::x;
int Foo::* py = &Foo::y;
cout << (unsigned long &)px << endl; // 输出0
cout << (unsigned long &)py << endl; // 输出4
cout << sizeof(px) << endl; // gcc输出8
}
数据成员指针的大小和实现相关。
成员函数指针比一般指针占用更多空间
和编译器相关。gcc 里成员函数指针在 64 位机器下是 16 字节。
如果成员函数不是虚函数:函数地址固定;this 指针偏移也可以通过类型在编译时计算出来。先偏移后调用,应该只需要 8 个字节。
如果成员函数是虚函数:

