在没有实例化的情况下计算结构成员的偏移量

时间:2017-01-02 00:34:10

标签: c++

这段代码怎么样,它是标准的吗?我在Visual C ++标题中看到过这种代码,它可以计算一些结构成员的偏移量,但它是如何工作的呢?

#include <iostream>

struct Foo
{
    int a;
    int b;
    int c;
};


int main(int argc, char** argv)      
{
    int* i1 = (&((Foo*)0)->a);
    int* i2 = (&((Foo*)0)->b);
    int* i3 = (&((Foo*)0)->c);

    std::cout << "i1 = " << i1 << "\ni2 = " << i2 << "\ni3 = " << i3 << "\n";
    return 0;
}

Results : i1 = 0, i2 = 4, i3 = 8

编辑: 记得之前我看过这段代码的地方。它位于WinNT.h

#define FIELD_OFFSET(type, field)    ((LONG)(LONG_PTR)&(((type *)0)->field))

1 个答案:

答案 0 :(得分:2)

这很常见,因为宏偏移。看看http://en.cppreference.com/w/cpp/types/offsetof

它作为每个成员的内存位置和结构的内存位置的距离。在您的示例中,您将struct的内存位置设置为0,因此无需计算距离。