次のような構造体がある場合:
struct {
int a;
int b;
int values[20];
}
どんな種類のパディングがありますか?
この件について検索しましたが、見つかったすべての情報は、異なるデータ型の間のパディングです。
どんな種類のパディングがありますか?
パディングは実装によって定義されたものだと思います。ただし、すべてのメンバーを同じバイト数に揃える必要があるため、そうではないというのが妥当な説明です。これは確かに、GCCを搭載した私のMac(OS 10.7.5)にも当てはまります。
(構造体のサイズは88バイトです:4 + 4 + 20 * 4なので、パディングはありません。)
int
そのシナリオで標準が許可する唯一のパディングは、すべての変数に共通のパディングだと思います。オーバーレイint
するメモリ位置に存在するすべてのビットを使用するのが一般的ですが、必須ではありません。unsigned char
一部のデジタル シグナル プロセッサには、36、40、または 48 ビットなど、2 のべき乗でない長さのアキュムレータがあります (合計が 32 ビットを超える 32 ビット数の束を足し合わせたい場合が多いという考えです。 32 ビットより大きいアキュムレータが必要ですが、64 ビットのアキュムレータは非常にやり過ぎです)。16 ビット メモリ バスを備えた DSP は、メモリから値を読み書きできる場合がありますchar
が、それ以外のすべてについて特定のアライメントが必要です。そのような DSP に 40 ビットのアキュムレータがある場合、そのようなデバイスはそのint
6 バイトとして入力し、そのうちの 1 つは未使用になります (そのようなデバイスは 32 ビットint
タイプを使用する可能性が高いと思います。40 ビットは「合法」です)。short long
int
int
一般に、標準では、そのサイズよりも大きいアラインメントを必要とする型はなく、少なくとも構造体内の任意の型の配列には、基になる型と同じアラインメント要件があることが要求されます (実装によっては、特別なアラインメント要件がある場合があります)。静的に割り当てられた配列。たとえば、サイズがページよりも小さい配列は、#pragma またはその他の指示でマークされていない限り、ページの境界を越えないように配置する必要がありますが、標準はそのような要件を認識していません。可能な唯一の効果は、プログラムがメモリを使い果たすことなく宣言できる変数の数を減らすことであるためです)。