获取类成员变量的偏移量(通过指向类的成员变量的地址)

1,563 阅读1分钟
#include <iostream>

class Point3d {
public:
    virtual void func(){}

private:
    int x;
    int y;
    int z;

public:
    // 注意写法只是在 int* get_offset()的基础上额外添加了Point3d::限定符
    static int Point3d::* get_offset_x()
    {
        return &Point3d::x;
    }

    static int Point3d::* get_offset_y()
    {
        return &Point3d::y;
    }

    static int Point3d::* get_offset_z()
    {
        return &Point3d::z;
    }

};

int main()
{
    Point3d p;
    printf("Point3d::x offset: %d\n", Point3d::get_offset_x());
    printf("Point3d::y offset: %d\n", Point3d::get_offset_y());
    printf("Point3d::z offset: %d\n", Point3d::get_offset_z());
    return 0;
}

输出:

Point3d::x offset: 8
Point3d::y offset: 12
Point3d::z offset: 16

解释:
x 的偏移为8,是因为vptr占据了最开头的8字节(64位环境)