名前空間
変種
操作

offsetof

提供: cppreference.com
< cpp‎ | types
 
 
 
型サポート
基本的な型
基本型
固定幅の整数型 (C++11)
(C++11)
offsetof
数値の限界
C の数値限界インタフェース
実行時型情報
型特性
型カテゴリ
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
型プロトタイプ
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(C++20以前)
(C++11)(C++20で非推奨)
(C++11)
型特性定数
メタ関数
(C++17)
エンディアン
(C++20)
サポートされている操作
関係と性質の問い合わせ
(C++11)
(C++11)
型変更
(C++11)(C++11)(C++11)
型変換
(C++11)
(C++11)
(C++17)
(C++11)(C++20以前)(C++17)
 
ヘッダ <cstddef> で定義
#define offsetof(type, member) /*implementation-defined*/

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

type標準レイアウト型でない場合、動作は未定義です (C++17以前) offsetof マクロの使用は条件付きでサポートされます (C++17およびそれ以降)

member静的メンバまたはメンバ関数の場合、動作は未定義です。

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

offsetof(type, member)型依存になることはなく、 type が依存の場合にのみ値依存になります。

目次

[編集] 例外

offsetof は例外を投げません。 式 noexcept(offsetof(type, member)) は必ず true に評価されます。

[編集] ノート

offsetof は標準 C++ で実装することはできず、コンパイラサポートが必要です (GCC, LLVM)。

[編集]

#include <iostream>
#include <cstddef>
struct S {
    char c;
    double d;
};
int main()
{
    std::cout << "the first element is at offset " << offsetof(S, c) << '\n'
              << "the double is at offset " << offsetof(S, d) << '\n';
}

出力例:

the first element is at offset 0
the double is at offset 8

[編集] 関連項目

sizeof 演算子によって返される符号なし整数型
(typedef) [edit]
型が標準レイアウト型かどうか調べます
(クラステンプレート) [edit]