• ベストアンサー

構造体のアライメント調整

構造体のアライメント調整について教えて下さい。 (1) アライメント調整を行う目的は何ですか? (2) char = 1byte short = 2byte int = 4byteの時、 下の構造体にアライメント調整を行うとすれば、どうすればいいでしょうか? typedef struct{ ____char hoge1 ____char hoge2 ____short hoge3 ____char hoge4 ____int hoge5 ____int hoge6 ____char hoge7 }tHOGEHOGE 下の形になるかなぁと思っているのですが、本当に(1)~(4)まで全部必要でしょうか? typedef struct{ ____char hoge1 ____char hoge2 (1)__char reserve[2] ____short hoge3 (2)__char reserve[2] ____char hoge4 (3)__char reserve[3] ____int hoge5 ____int hoge6 ____char hoge7 (4)__char reserve[3] }tHOGEHOGE つまらない質問で申し訳ありませんが、 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

  struct s_t {     short s1;     long l1;     short s2;     short s3;     long l2;   }; のように定義した構造体のメモリ上のレイアウトが、ある環境Aでは   Offset   0x00: short s1   0x02: long l1   0x06: short s2   0x08: short s3   0x0a: long l2 のようになり、別のある環境Bでは   Offset   0x00: short s1   0x02: short padding   0x04: long l1   0x08: short s2   0x0a: short s3   0x0c: long l2 のようになるのだとすれば、環境Aと環境Bで同じレイアウトになる構造体は   struct s_t {     short s1;     short reserved1;     long l1;     short s2;     short s3;     long l2;   }; のようにすればよいことになります。 この例のように、「ある環境Aではこう、別のある環境Bではこう」と説明してもらわなければ、「それならこう変えればよい」という結論を得ることはできません。

tyapio
質問者

お礼

本説明にて、疑問点は解決しました。 ありがとうございましたm(__)m

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

どのマシンにも通用する最大公約数的なアライメントであれば、以下の規則が全て満足できるものです。 1.構造体のサイズは、そのメンバの最大の型のサイズの整数倍であること。  例:int(4バイト)が最大の型なら、4の倍数であること。同様に、double(8バイト)が最大の型なら、8の倍数であること。 2.各メンバの構造体の先頭からの相対位置は、そのメンバのサイズの整数倍であること。  例:int型であれば、0,4,8,12,・・・バイト目に存在すること。double型であれば、0,8,16,24、・・・バイト目に存在すること。 上記の、2つが、成立すれば、問題ありません。  

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

環境が異なる場合にはアラインメントの他にエンディアンの問題もあります. 現在ではほとんどのプロセッサがビッグエンディアンかリトルエンディアン (またはその両方) なんですが, どっちともいいがたいものもあります. で, アラインメントとかエンディアンとかを考えなきゃいけないのはなぜかというと, そもそも short とか int とかが混在しているのが原因だったりします. ということで, いっそのこと「(unsigned) char の配列として定義しておき, 必要なときに適宜切り分ける」のがベストかも....

すると、全ての回答が全文表示されます。
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

(1) 次のような目的が考えられます。(他にもあるかもしれません。) ・同一のソースプログラムを使ってもコンパイラやコンパイルオプションによって構造体のアラインメントが異なっている場合があるので、その調整のため。 ・構造体の中のデータの位置によってプログラムの実行速度が異なる場合があるので、その調整のため。 逆に言えば、単一のプログラム(あるいは単一の環境)のみで処理が完結する場合はアラインメント調整は必要ありません。 (2) アラインメント調整を行わなければならない理由がなければ、行う必要はありません。行う必要がある場合は、その必要性に応じた位置で調整する必要があります。 何のために行うのかが分からないと、どこを調整してよいのかは分かりません。

tyapio
質問者

補足

また、説明不足で申し訳ありません。 目的は教えて頂いた1つ目です。 >・同一のソースプログラムを使ってもコンパイラやコンパイルオプションによって構造体のアラインメントが異なっている場合があるので、その調整のため。 この目的の場合についてご教授下さい。

すると、全ての回答が全文表示されます。

関連するQ&A