将 C 中的结构成员对齐到 32 字节,
aligning a struct member in C to 32 bytes,
我在 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 应该完成这项工作,但编译器不知道。您必须使用特殊的编译器特定属性告诉编译器 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 中有以下代码摘录,
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 应该完成这项工作,但编译器不知道。您必须使用特殊的编译器特定属性告诉编译器 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);