缓存对齐的堆栈变量

Red*_*III 6 c++ memory-alignment c++11

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

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

愚蠢的我!堆栈不分配变量这种方式,从而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;
}
Run Code Online (Sandbox Code Playgroud)

编译器:Clang 3.2

raz*_*zeh 4

要正确对齐多个变量,您必须使用聚合,因为自动变量的布局尚未定义。我在 C++11 标准中找不到任何内容表明具有自动存储功能的变量必须按照定义的顺序在堆栈上分配。该标准的第5.9节坚持只定义了几种指针比较,并且具有自动存储的变量之间的比较不在所定义的范围之内。