将C中的struct成员对齐到32个字节,

时间:2015-06-06 10:31:37

标签: c arrays memory-alignment

我在C中有以下代码提取,

typedef struct Item{
  int a;
  int b;
  int c;
  double d;
  double e;
  double* f;
  double* g;
} Item;

我有一个声明为

的结构项的数组
  Item* result[/*no.of threads*/];

当我初始化这个结构时,我希望它将它与32个字节对​​齐,所以我在for循环中做了以下内容,

for (int i = 0; i < threads; i++){
      posix_memalign((void **)&result[i], 32, sizeof(Item));
}

但是这给了我以下错误,

 error: use of undeclared identifier 'i'
我不允许这样做吗?如果是这样,有没有其他方法将数组对齐到特定的大小?

编译器:x86上的clang 3.4

1 个答案:

答案 0 :(得分:1)

错误消息与发布的代码无关,您可能会错过原始代码中i的定义。

在32字节边界上对齐结构的方法是不可移植的。您使用系统特定的API分配每个结构,该API应该完成这项工作,但编译器不知道这一点。您必须使用特殊的编译器特定属性告诉编译器struct本身的对齐约束。此外,如果您希望每个结构在32个字节上对齐以使用AVX扩展来将结果存储到其中,则需要对成员进行重新排序,以使double位于开头,从而正确对齐。

C11引入了posix_memalign的便携替代方案:

#include <stdlib.h>
void *aligned_alloc(size_t alignment, size_t size);

如果您的系统支持,可以使用它,但请注意size必须是alignment的倍数,因此您可能需要写:

aligned_alloc(32, (sizeof(Item) + 31) / 32 * 32);