缓存对齐的堆栈变量

时间:2013-03-24 00:17:44

标签: c++ c++11 memory-alignment

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

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

愚蠢的我! Stack不会以这种方式分配变量,因此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

1 个答案:

答案 0 :(得分:4)

要正确对齐多个变量,必须使用聚合,因为未定义自动变量的布局。我在C ++ 11标准中找不到任何说明自动存储的变量必须按照它们定义的顺序在堆栈上分配。该标准的第5.9节坚持只定义了几种指针比较,并且自动存储的变量之间的比较不属于定义的那些。