0

バイト パディングによると、32 ビット OS では、コンピューターのワード サイズが 4 バイト (1 バイトは 8 ビットを意味する) の場合、ここに示すように、CPU は 4 の倍数でメモリをアドレス指定できます。読み取るデータはメモリ オフセットにある必要があります。これが当てはまらない場合、たとえば、データが 16 番目のバイトではなく 14 番目のバイトから始まる場合、コンピュータは 2 つの 4 バイトのチャンクを読み取って、要求されたデータが読み取られる前に何らかの計算を行う必要があります。または、アラインメント違反が発生する可能性があります。前のデータ構造は 14 バイト目で終了しますが、次のデータ構造は 16 バイト目で開始する必要があります。次のデータ構造を 16 番目のバイトに揃えるために、2 つのデータ構造の間に 2 つのパディング バイトが挿入されます。

#include<stdio.h>
struct test {
        char a;
        char b;
        int c;
        int d;
};
void main() {
        int a,b;
        char c,d;
        printf("Address of a & b = %u & %u respectively\n",&a,&b);
        printf("Address of c & d = %u & %u respectively\n",&c,&d);      
        struct test t1;
        printf("The size of structure:::%d\n",sizeof(t1));
}

出力は次のとおりです。

Address of a & b = 3216087804 & 3216087808 respectively
Address of c & d = 3216087802 & 3216087803 respectively
The size of structure:::12

このように構造を宣言したとき:

struct test {
        char a;
        int b;
        int c;
        char d;
};

この場合の出力:

The size of structure:::16

メモリ内の奇数の場所にある 2 番目の char 変数、または 4 の倍数のアドレスに存在しない変数にアクセスしようとすると、アラインメント違反が発生しないのはなぜですか?

4

1 に答える 1

0

どちらの場合もパディングが行われています。あなたが提供したコード内でchar bは、パディングを必要としないため、何も受け取りません。int c2バイトのパディングが必要で(典型的なx86ルールを想定しています)、それを取得します。構造体の合計サイズは、データの 10 バイト + 示された 12 バイトのパディングの 2 バイトです。

別のケースでは、 int b3 バイトのパディングが必要であり、構造体全体ではchar a、4 バイトの境界アドレスを配置するためにさらに 3 バイトが必要です。10 バイトのデータ + 3 + 3 バイトのパディングで 16 バイトになります。

于 2013-01-09T19:20:25.350 に答える