2014年7月24日木曜日

C言語で構造体の中のメンバの順序

ずっと勘違いしていた。C言語の構造体の中でのメンバの並びはコンパイラがいくらでも最適化しうるから、ソースコートで記述した順序が保たれる保証は全くないと思っていたのだが、そんなことはなかった

リンク元から引用の引用をすると、

構造体オブジェクト内では, 非ビットフィールドメンバ及びビットフィールドが置かれる単位は, 宣言された順に増加するアドレスをもつ。構造体オブジェクトへのポインタは, 適切に変換すれば, その先頭メンバ(又はビットフィールドならば, それが置かれた単位)を指す。さらに, その逆も成り立つ。構造体オブジェクトの中に名前のない詰め物があってもよいが, 先頭には名前のない詰め物があってはならない。
だそうな。構造体の先頭以外にはパディングされうるけど、メンバの並び順までは変えられない。例えばこの構造体
struct s {
  char a;
  int b;
  char c;
};
に対しては、必ず以下の関係が満たされるわけだ。
offsetof(struct s, a) < offsetof(struct s, b) < offsetof(struct s, c)
上の例だと、a, b, cという順序に特に意味がなければ、大抵の場合はb, a, cと並び替えた方がメモリ使用効率が良いだろう。

パディングする/しないはC言語の標準機能で選べないので、具体的なオフセット値までは標準機能だけでは保証されない。

0 件のコメント:

コメントを投稿