可能重复:
对齐的内存管理?
我有一个数组,我要这样声明
int * myarray;
int num_of_element;
myarry = (int*) calloc(num_of_elements, sizeof(int));
int 的大小是 4 个字节,但是我想确保我的数组从 8 个字节的边界开始 - 所以我每次可以有效地加载两个值。有什么不同的方法或我可以做的其他事情吗?
可能重复:
对齐的内存管理?
我有一个数组,我要这样声明
int * myarray;
int num_of_element;
myarry = (int*) calloc(num_of_elements, sizeof(int));
int 的大小是 4 个字节,但是我想确保我的数组从 8 个字节的边界开始 - 所以我每次可以有效地加载两个值。有什么不同的方法或我可以做的其他事情吗?
有几种方法。
过度分配,并将返回的地址四舍五入到所需的对齐方式。
定义一个具有所需对齐类型的联合,通常是double
. 这需要低级知识,但在您想要分配数组时不是最佳选择。
你试过了posix_memalign
吗?
函数 posix_memalign() 分配
size
字节并将分配的内存地址放在*memptr
. 分配内存的地址将是 的倍数alignment
,必须是 2 的幂和 的倍数sizeof(void *)
。
例子:
if (posix_memalign(&myarray, 8, num_of_elements*sizeof(int)) != 0) {
// failed
}
见http://pubs.opengroup.org/onlinepubs/009696699/functions/posix_memalign.html
Linux posix_memalign 手册页还记录了aligned_alloc() (c11), memalign() (obsolete):
https://www.kernel.org/doc/man-pages/online/pages/man3/posix_memalign.3.html