構造体のアラインメントは、そのすべてのフィールドも正しくアラインされるようにする必要があります (特にそれらが配列の一部である場合)。
ここにあるすべてのフィールドのアライメント要件は 1 であるため、それは構造体自体のアライメント要件でもあります。
つまり、これらの構造体を 2 つ並べて配置すると、どちらの構造体のフィールドも配置要件に違反しません。
それを次のように対比してください。
struct moreComplexCase {
char char1WithAlignment1;
// 3 byte gap to align below item.
unint32_t uintWithAlignment4;
char char2WithAlignment1;
// 3 byte gap to align structure itself.
}
そこに 2 つのパディング セクションが表示されます。1 つ目は、 が適切に配置されていることを確認することです (指定されたパディングに正しくuint32_t
配置されるように、構造体の配置も 4 にする必要があることも確認できるはずです)。uint32_t
最後のパディングは、配列の 2 番目の要素 (さらに言えば、後続のすべての要素) も正しく配置されるようにすることです。
C標準自体は、アラインメントが何であるかを規定していません。アラインメントが存在する可能性があるだけです。たとえば、初期の x86 チップ (およびおそらく現在のもの) は、位置合わせされていないデータを適切に処理します (または少し遅くなる可能性があります) が、他のアーキテクチャ (たとえば、初期の ARM チップ) は、それを行おうとすると、単純にクラッシュするか、障害を発生させます。 .