4

パディングの仕組みを理解しています。アラインメントとは何かを知っています。私にとって奇妙なのは、char フィールドのみを持つ構造体のサイズが 4 バイトに整列されていない (末尾にパディングがある) ことです。これは単に仕様で保証されていないと思われるため、コンパイラはそれを行いません。その場合、そのようなルールへの参照を取得できますか? 主に x86 および x86-64 アーキテクチャに興味があります。

例:

struct foo {
    char field1;
    char field2;
    char field3;
} foo2;

int main(void)
{
    printf("sizeof=%lu\n", sizeof foo2);
}

出力:sizeof=3

4

1 に答える 1

6

構造体のアラインメントは、そのすべてのフィールドも正しくアラインされるようにする必要があります (特にそれらが配列の一部である場合)。

ここにあるすべてのフィールドのアライメント要件は 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 チップ) は、それを行おうとすると、単純にクラッシュするか、障害を発生させます。 .

于 2017-07-21T04:30:02.480 に答える