名前空間
変種
操作

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)(deprecated in C++17)
(C++11)(deprecated in C++20)
(C++11)
型特性定数
メタ関数
(C++17)
エンディアン
(C++20)
サポートされている操作
関係と性質の問い合わせ
(C++11)
(C++11)
(C++11)
(C++11)
型変更
(C++11)(C++11)(C++11)
型変換
(C++11)
(C++11)
(C++17)
(C++11)(deprecated in C++17)(C++17)
 
ヘッダ <cstddef> で定義
#define offsetof(type, member) /*implementation-defined*/
マクロoffsetofstd::size_t型の定数に展開され、値が指定された型のオブジェクトの先頭から、もしあればパディングを含め、指定したメンバーに、バイト単位でオフセットされます.
Original:
The macro offsetof expands to a constant of type std::size_t, the value of which is the offset, in bytes, from the beginning of an object of specified type to its specified member, including padding if any.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

目次

[編集] ノート

typeは、標準レイアウト型でない場合、動作は未定義です.
Original:
If type is not a standard-layout type, the behavior is undefined.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
memberは静的メンバあるいは関数メンバである場合、動作は未定義です.
Original:
If member is a static member or a function member, the behavior is undefined.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
標準レイアウトの種類の最初のメンバのオフセット(空のベース最適化必須です)は常にゼロです
Original:
The offset of the first member of a standard-layout type is always zero (空のベース最適化 is mandatory)
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[編集] 可能な実装

#define offsetof(type,member) ((std::size_t) &(((type*)0)->member))

[編集]

#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]