3

パディングとそのルール、必要な理由などを認識しています。

私の質問には構造が与えられ、

struct my_struct {
   int a;
   char c;
};

この場合、c の開始アドレスはワード アラインですが、コンパイラは 3 バイト (ワード サイズとして 4 を想定) のパディングを追加します。cの後に要素がなく、なぜこれらの3バイトが必要なのですか? 以下を確認したところ、

int g_int1;
struct my_struct st;
int g_int2;

上記で私が言いたいのは、残りの変数宣言は、前の変数サイズの単語の整列度に依存していないということです。コンパイラは、グローバルまたはローカルの自動変数に関係なく、常に次の変数を整列しようとします。

これはcharであり、1バイトでは問題にならないため、エンディアンネスの理由はわかりません。私が思う理由は、最後の要素の条件コンパイラをチェックする代わりに、必要に応じて常にパディングを追加することです。

正当な理由は何ですか?

4

3 に答える 3

11

なぜなら、もしsizeof(my_struct)8ではなく5だったなら、あなたがこれをしたなら:

my_struct array[2];

次にarray[0]、単語に合わせますが、array[1]そうではありません。sizeof(array[0])(配列のルックアップは、最初の要素のアドレスにの倍数を追加することによって行われることを思い出してください。)

于 2013-01-30T15:04:17.063 に答える
6

の配列があると想像してくださいstruct my_struct。それぞれの要素のサイズが単語の倍数でない場合、その要素はどのように単語に揃えられますか?

于 2013-01-30T15:03:17.643 に答える
1

オブジェクトのサイズも揃える必要があります。my_structsの配列があると想像してください。この場合、すべての要素の開始アドレスを揃える必要があります。したがって、sizeof(struct my_struct)は「整列」されている必要があります。そうしないと、割り当てる必要のあるメモリの量を知ることができません。

于 2013-01-30T15:05:30.883 に答える