【问题标题】:Calculate offsets of structure members without instantiation [duplicate]计算没有实例化的结构成员的偏移量[重复]
【发布时间】:2017-01-02 00:34:10
【问题描述】:

这段代码怎么样,是标准的吗?我在 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))

【问题讨论】:

  • &lt;cstddef&gt; 中定义了一个标准宏offsetof(structure,field),它就是这样做的。所以是的,代码是有效的,但是使用标准宏会使它更标准。
  • TL;DR:实现可以做这样的事情,你不能。
  • 你说我做不到是什么意思,我能做到,我的程序有效。
  • @nikau6 你“可以”也闯红灯,这也有效(大部分时间)。但这并不意味着它是合法的或一个好主意。
  • 这是我的问题,它是标准的吗?以前的答案说它是有效的。有效或无效,不能两者兼而有之。

标签: c++


【解决方案1】:

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

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

【讨论】:

  • 如果将内存位置设置为 0 ... 运算符“->”不是分段错误吗?
  • 段错误发生在您实际尝试访问成员变量或调用成员函数时。使用 &,你只是在计算内存地址。
  • 即使从位置 0 开始计算偏移量仍然很有用。
猜你喜欢
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多