0

アラインメント要件とワードサイズに混乱しています。私は 64 ビット プロセッサで作業しているので、ワード サイズは 8 です。つまり、割り当てられるアドレスは 8 の倍数でなければなりません。
しかしalignof、予想外の結果が得られます。

struct A
{
    int a;
    char b;
}

出力:

sizeof(A): 8
alignof(A): 4 // why?

比較において、

sizeof(double): 8
alignof(double): 8

4 の倍数で 8 の倍数でないアドレスを に指定すると、Aアクセスが 1 つ増えるためパフォーマンスが低下しますが、それでよろしいですか?

alignof()この特定の例の 8 バイトでのアラインメントは、単純なメモリ パフォーマンスのトレードオフで優れているのに対し、従う必要がある最小の要件を提供するためでしょうか?

4

3 に答える 3

1

標準では、アラインメントと一般的な構造体のレイアウトに関してほとんど保証されていません。

その中で:

  • すべてのアライメントは 2 の累乗です。
  • 構造体には、その最も整列されたサブオブジェクトよりも小さい整列要件はありません。(些細な)
  • 構造体のサイズは、そのアライメントの倍数です (これも自明です。それ以外の場合、配列は不可能です)。

あなたの例はそれらすべてを満たしています。必要に応じて、より強力なアライメントを取得できます (C++11):

struct alignas(8) A {
    int a;
    char b;
}

また、プロセッサのビット数が 64 であるという理由だけで、ほとんどの型のより高いアライメント要件には反映されませんが、強力にアライメントされたデータは読み取り/書き込みパフォーマンスが向上します。

アラインメントが弱いと、データがより多くのキャッシュラインにまたがり、プロセッサがより多くのキャッシュラインをフェッチする必要がある場合にのみ、パフォーマンスが低下します。

于 2014-08-09T18:39:14.573 に答える