6

新しいC++11アライメントツールを使用して、一時(スタック)変数のセットが1つのキャッシュラインにあることを確認したかったのです。私の最初の素朴な試みは次のとおりでした。

int main() {
    alignas(64) int a; // 0x7fffc58aac80, properly aligned at 64
    int b; // 0x7fffc58aac7c
    int c; // 0x7fffc58aac78
    return 0;
}

愚かな私!スタックはこの方法で変数を割り当てないため、およびとaは異なるキャッシュラインに配置されます。bc

これは、複数の変数を適切に整列させる唯一の方法が集計を介することを意味しますか?

struct alignas(64) Abc {
   int x;
   int y;
   int z;
};

int main() {
   Abc foo;
   // x 0x7fff40c2d3c0 (aligned at 64)
   // y 0x7fff40c2d3c4
   // z 0x7fff40c2d3c8   
   return 0;
}

コンパイラ:Clang 3.2

4

1 に答える 1

4

自動変数のレイアウトが定義されていないため、複数の変数を適切に配置するには、集計を使用する必要があります。自動ストレージを持つ変数は、定義されているのと同じ順序でスタックに割り当てる必要があると述べているC++ 11標準には何も見つかりません。標準のセクション 5.9 では、少数の種類のポインター比較のみが定義されていると主張しており、自動ストレージを使用した変数間の比較は、定義されているリストに含まれていません。

于 2013-03-24T18:20:03.337 に答える