C++ 中的 offsetof 宏

offsetof macro in c++

#define offsetof(s,m) ((::size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))

我已经找了几分钟这段代码,但我仍然不明白 const char volatile 引用是什么东西,这让我很头疼。

#define offsetof(s,m) ((size_t)&(((s*)0)->m))

这个很清楚,确实有道理而且效果很好,为什么另一个被MSVC编译器使用。

如果 s::m 是 class 类型,它可能会重载 operator&,因此 &(((s*)0)->m) 将与 (((s*)0)->m).operator&() 相同,这可以出乎意料的事情。

为了不使用任何自定义 operator&,首先将其转换为 const volatile char&(将具有相同的地址)。它需要同时是 constvolatile 因为 s::m 可能是 const and/or volatile.

这就是 std::addressof 在 C++11 之前的实现方式。

offsetof在标准库中的原因是它不能被移植。所以你正在查看 compiler-specific 代码。不要试图分析它。把时间花在更有成效的事情上。