Namespaces
Variants

offsetof

From cppreference.net
Utilities library
ヘッダーで定義 <cstddef>
#define offsetof(type, member) /* implementation-defined */

マクロ offsetof std::size_t 型の整数定数式に展開され、その値は指定された型のオブジェクトの先頭から、その指定されたサブオブジェクトまでのバイト単位のオフセットであり、もしあれば パディングビット も含みます。

静的ストレージ期間を持つ型 type のオブジェクト o が与えられたとき、 o. member o の部分オブジェクトを参照する左辺値定数式でなければならない。それ以外の場合、動作は未定義である。特に、 member 静的データメンバ ビットフィールド 、または メンバ関数 である場合、動作は未定義となる。

type PODType (C++11まで) スタンダードレイアウト (C++11以降) でない場合、 offsetof の結果は未定義 (C++17まで) offsetof マクロの使用は条件付きサポート (C++17以降) となります。

offsetof ( type, member ) は決して 型依存 ではなく、また type が依存型である場合に限り値依存となります。

目次

例外

offsetof は例外をスローしません。

noexcept ( offsetof ( type, member ) ) は常に true と評価されます。

(C++11以降)

注記

標準レイアウト型の最初のメンバーのオフセットは常にゼロです( 空基底クラス最適化 は必須です)。

(C++11以降)

offsetof は標準C++では実装できず、コンパイラのサポートが必要です: GCC , LLVM .

member は直接のメンバーに限定されません。配列メンバーの要素など、特定のメンバーのサブオブジェクトを表すこともできます。これは C DR 496 で規定されています。

C23では、括弧で囲まれていないカンマを含む新しい型を offsetof 内で定義することは未定義動作であると規定されており、このような使用法はC++モードでの実装では一般的にサポートされていません: offsetof ( struct Foo { int a, b ; } , a ) は既知のすべての実装によって拒否されます。

#include <cstddef>
#include <iostream>
struct S
{
    char   m0;
    double m1;
    short  m2;
    char   m3;
//  private: int z; // warning: 'S' is a non-standard-layout type
};
int main()
{
    std::cout
        << "offset of char   m0 = " << offsetof(S, m0) << '\n'
        << "offset of double m1 = " << offsetof(S, m1) << '\n'
        << "offset of short  m2 = " << offsetof(S, m2) << '\n'
        << "offset of char   m3 = " << offsetof(S, m3) << '\n';
}

出力例:

offset of char   m0 = 0
offset of double m1 = 8
offset of short  m2 = 16
offset of char   m3 = 18

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
CWG 273 C++98 offsetof は単項演算子 operator& がオーバーロードされている場合に
動作しない可能性があった
operator& がオーバーロードされていても
正しく動作することが要求される
LWG 306 C++98 type PODType でない場合の動作が規定されていなかった この場合の結果は未定義となる
LWG 449 C++98 offsetof のその他の要件が LWG issue 306 の解決によって削除されていた これらの要件を再追加

関連項目

sizeof 演算子によって返される符号なし整数型
(typedef)
型が スタンダードレイアウト 型かどうかをチェックする
(クラステンプレート)