6

使用新的 C++11 对齐工具,我想确保一组临时(堆栈)变量位于一个缓存行中。我的第一次天真的尝试如下:

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 回答