我想将应用程序中的数据结构与缓存行对齐。这是一个简单的场景:
typedef struct container {
int a;
int b;
} cont __attribute__((aligned(64));
int main() {
cont *a;
a = malloc( sizeof(cont) * 10);
printf("%p", a);
return 0;
}
在这种情况下,我认为数组的起始地址将是高速缓存对齐,即从64字节边界开始。但是打印的地址是0x9dd008,它没有与64字节边界对齐。我在这个实现中遗漏了什么吗?
答案 0 :(得分:1)
您正在从堆中分配,并且返回的地址由malloc()
确定。由于代码已经编译,编译器无法强制执行请求的地址对齐。
如果您尝试在堆栈上分配cont
,您应该看到正确的对齐方式。
答案 1 :(得分:1)
您应该使用posix_memalign()
来分配具有特定内存对齐的内存。在C11中,您还有机会使用aligned_alloc()
,它将在其他平台(POSIX旁边)中提供与posix_memalign()
相同的功能。