是否存在适用于结构体成员方法的offsetof版本?
核心结论
你无法像获取普通成员变量偏移那样,获取成员函数在结构体中的偏移量,这是C++的内存模型决定的:
原因说明
- 非虚成员函数不属于结构体实例的内存组成部分:所有结构体实例共用同一份成员函数的代码实体,成员函数本质是隐含了
this指针作为第一个参数的普通函数,不会在每个结构体实例的内存空间中占用存储位置,因此不存在「相对于结构体实例首地址的偏移」这个概念。
你可以验证:当前示例中sizeof(Struct)的大小和sizeof(int)完全一致,结构体的内存布局里没有给成员函数a()预留任何空间。 - 你获取到的
&Struct::a是成员函数指针,它本身存储的是函数代码段的入口地址(如果是虚函数的话可能还包含虚表偏移信息),和结构体实例的内存布局无关。
特殊场景说明(虚函数虚表偏移)
如果你是想获取虚函数在对应虚表中的偏移量,可以通过编译器特定的hack方式实现,但这类实现没有统一的标准,不具备跨编译器可移植性,且它的含义和offsetof获取的结构体成员偏移完全不是一回事。
内容的提问来源于stack exchange,提问作者OmniSudo
相关产品推荐
相关产品推荐

