【问题标题】:aligning a struct member in C to 32 bytes,将 C 中的结构成员对齐为 32 个字节,
【发布时间】:2015-06-06 10:31:36
【问题描述】:

我在 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

【问题讨论】:

  • 数组紧凑,不能重新对齐单个数组元素。您只需要在分配数组时对齐第一个元素,并且可能用例如标记结构__attribute__ ((aligned (32))) 用于 gcc。
  • @keltar:数组是一个指针数组。 OP 为每个线程分配单独的结构。他希望这些结构在 32 字节上对齐,并使用 posix_memalign 分配它们。
  • @chqrlie 是的,被无意义的错误消息打扰了,所以没有仔细查看代码。对不起。

标签: c arrays memory-alignment


【解决方案1】:

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

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

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2011-06-20
    • 2011-10-14
    • 1970-01-01
    • 2013-01-31
    • 2012-08-07
    • 2019-07-14
    相关资源
    最近更新 更多