プロが教えるわが家の防犯対策術!

構造体のアライメント調整について教えて下さい。

(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


つまらない質問で申し訳ありませんが、
よろしくお願いいたします。

A 回答 (4件)

  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ではこう」と説明してもらわなければ、「それならこう変えればよい」という結論を得ることはできません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/29 14:07

どのマシンにも通用する最大公約数的なアライメントであれば、以下の規則が全て満足できるものです。


1.構造体のサイズは、そのメンバの最大の型のサイズの整数倍であること。
 例:int(4バイト)が最大の型なら、4の倍数であること。同様に、double(8バイト)が最大の型なら、8の倍数であること。
2.各メンバの構造体の先頭からの相対位置は、そのメンバのサイズの整数倍であること。
 例:int型であれば、0,4,8,12,・・・バイト目に存在すること。double型であれば、0,8,16,24、・・・バイト目に存在すること。
上記の、2つが、成立すれば、問題ありません。



 
    • good
    • 0

環境が異なる場合にはアラインメントの他にエンディアンの問題もあります. 現在ではほとんどのプロセッサがビッグエンディアンかリトルエンディアン (またはその両方) なんですが, どっちともいいがたいものもあります.


で, アラインメントとかエンディアンとかを考えなきゃいけないのはなぜかというと, そもそも short とか int とかが混在しているのが原因だったりします. ということで, いっそのこと「(unsigned) char の配列として定義しておき, 必要なときに適宜切り分ける」のがベストかも....
    • good
    • 0

(1) 次のような目的が考えられます。

(他にもあるかもしれません。)

・同一のソースプログラムを使ってもコンパイラやコンパイルオプションによって構造体のアラインメントが異なっている場合があるので、その調整のため。

・構造体の中のデータの位置によってプログラムの実行速度が異なる場合があるので、その調整のため。

逆に言えば、単一のプログラム(あるいは単一の環境)のみで処理が完結する場合はアラインメント調整は必要ありません。

(2) アラインメント調整を行わなければならない理由がなければ、行う必要はありません。行う必要がある場合は、その必要性に応じた位置で調整する必要があります。

何のために行うのかが分からないと、どこを調整してよいのかは分かりません。

この回答への補足

また、説明不足で申し訳ありません。
目的は教えて頂いた1つ目です。

>・同一のソースプログラムを使ってもコンパイラやコンパイルオプションによって構造体のアラインメントが異なっている場合があるので、その調整のため。

この目的の場合についてご教授下さい。

補足日時:2005/06/29 13:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!