6

次のように、コードで異常な動作が発生しています

#include<stdio.h>
struct a
{
    int x;
    char y;
};
int main()
{   
   struct a str;
   str.x=2;
   str.y='s';
   printf("%d %d %d",sizeof(int),sizeof(char),sizeof(str));
   getch();
   return 0;
}

このコードでは、次の出力が得られます。

4 1 8

私の知る限り、構造体にはサイズ 4 の整数変数とサイズ 1 の char 変数が含まれているため、構造体のサイズは 5 である必要があります。しかし、構造体のサイズはどうして 8 になるのでしょうか。ビジュアル C++ コンパイラを使用しています。なぜこの振る舞いをするのですか?

4

3 に答える 3

12

構造パディングと呼ばれます

4 バイト ワード アラインメントで始まるデータ構造 (4 バイト バスとプロセッサを備えた CPU) を使用すると、メモリ内および RAM と CPU 間でデータを移動するときにはるかに効率的です。

通常、コンパイラ オプションやプラグマを使用してこれをオフにすることができます。その詳細は、特定のコンパイラによって異なります。

お役に立てれば。

于 2012-04-26T11:53:36.447 に答える
8

コンパイラは、最適化と整列のためにパディングを挿入します。ここで、コンパイラは両方のメンバーの間 (または後) に 3 つのダミー バイトを挿入します。

#pragmaディレクティブでアラインメントを処理できます。

于 2012-04-26T11:50:52.903 に答える