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&
(将具有相同的地址)。它需要同时是 const
和 volatile
因为 s::m
可能是 const and/or volatile.
这就是 std::addressof
在 C++11 之前的实现方式。
offsetof
在标准库中的原因是它不能被移植。所以你正在查看 compiler-specific 代码。不要试图分析它。把时间花在更有成效的事情上。
#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&
(将具有相同的地址)。它需要同时是 const
和 volatile
因为 s::m
可能是 const and/or volatile.
这就是 std::addressof
在 C++11 之前的实现方式。
offsetof
在标准库中的原因是它不能被移植。所以你正在查看 compiler-specific 代码。不要试图分析它。把时间花在更有成效的事情上。