c - 将 C 中的结构成员对齐到 32 字节,

标签 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

最佳答案

错误消息与发布的代码无关,您可能错过了原始代码中 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);

关于c - 将 C 中的结构成员对齐到 32 字节,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30681762/

相关文章:

objective-c - 是否可以将不同类型的对象添加到 iOS 的收藏夹列表中?

c - 为什么这个数组中的第一个元素不存储任何值?

c - 在 Linux 机器上获取用户的默认电子邮件

c - 是否有可以像终端一样显示文本的 Gtk3 Widget?

arrays - 如何将字符串编码的 float 数组解码为 float 数组?

c++ - 无法在 C++ 中遍历二维数组

C++:严格别名与 union 滥用

c++ - std::aligned_alloc() 的重新分配等效项是什么?

c - 是否在 C 中定义了结构类型的对齐方式?

c++ - 为什么不允许按值将数组传递给 C 和 C++ 中的函数?