17

私の知る限り、デフォルトでは4バイトのアラインメントが行われます。いう

typedef struct
{
     int data7;  
     unsigned char data8;
     //3 -bytes will be added here.
}Sample1;

だからsizeof(Sample1)8になります。

しかし、次の構造の場合、なぜパディングが発生しないのでしょうか。

typedef struct
{
     unsigned char data1;
     unsigned char data2;
     unsigned char data3;
     unsigned char data4;
     unsigned char data5;
     unsigned char data6;

}Sample2;

ただし、sizeof(Sample2)は6のみです。このSample2は4バイトに整列された構造ではありませんか?

編集::

ウィキによる

データアライメントとは、ワードサイズの倍数に等しいメモリオフセットにデータを配置することを意味します。これにより、CPUがメモリを処理する方法により、システムのパフォーマンスが向上します。

しかし、Sample2のメンバーは2の倍数で整列されませんよね??

ありがとう。

4

4 に答える 4

28

2番目の構造体のどのフィールドも4バイトの整列を必要としません。unsigned char1バイトのアライメントのみが必要です。したがって、実際に4バイトに揃える必要はありません。

構造体は通常、すべてのフィールドの最大配置にのみ配置されます。

于 2012-08-02T07:06:29.330 に答える
8

data7は4バイトの項目であるため、コンパイラは通常、4の倍数のアドレスにそれを整列させようとします。

data1は1バイトの項目であるため、コンパイラーはそれを特定の境界に揃えようとはしません(つまり、そうしても実際の利益はありません)。

于 2012-08-02T07:06:38.733 に答える
5

いいえ、一般的な実装Sample2では、4ビュートで整列された構造ではありません。これは、1バイトに整列された構造です。

一般的な実装では、構造全体の位置合わせ要件は、個々のメンバーの位置合わせ要件の最大値として計算されます。Sample1これが、アライメント要件がint(プラットフォームでは4)であり、Sample2アライメント要件が1である理由unsigned charです。

于 2012-08-02T07:11:08.923 に答える
2

Charには1バイトのアラインメントが必要です。そこにある最大データ型はcharであり、これは1バイトのアラインメントであるため、サイズは「6」になります。

詳細については、このサイトを確認してください。http://www.geeksforgeeks.org/archives/9705。彼らはそれを詳細に説明しました。

于 2012-08-02T08:09:09.400 に答える