2

次のC++コードに出くわしました:

 #define OFFSETOF_MEMBER(t, f) \
  (reinterpret_cast<uintptr_t>(&reinterpret_cast<t*>(16)->f) - static_cast<uintptr_t>(16u)) // NOLINT

ここで、t は型、f はフィールド名です。なぜ reinterpret_cast のパラメータとして整数 16 を指定できるのだろうか。

4

3 に答える 3

0

整数 16 は単なるメモリ アドレスです。式reinterpret_cast<t*>(16)は単に「アドレス 16 のオブジェクトを型として解釈する」という意味ですが、アドレスにそのようなオブジェクトtがないことがわかります。t理論的に16は、任意の 4x (32 ビット) または 8x (64 ビット) の整数に置き換えることができます。を選択する0と、マクロは次のように簡略化できます。

#define OFFSETOF_MEMBER(t, f) \
  (reinterpret_cast<uintptr_t>(&reinterpret_cast<t*>(0)->f))

詳細については、 offsetofを参照してください。

于 2018-07-18T07:01:37.457 に答える