将数组的开头与C中的动态内存对齐

时间:2012-09-18 14:03:44

标签: c arrays dynamic-memory-allocation memory-alignment calloc

  

可能重复:
  Aligned memory management?

我有一个我正在声明的数组

int * myarray;
int num_of_element;

myarry = (int*) calloc(num_of_elements, sizeof(int));

int的大小是4个字节但是我想确保我的数组在8字节边界上开始 - 所以我每次都可以高效地加载两个值。我可以采用不同的方式或其他方式吗?

2 个答案:

答案 0 :(得分:2)

有几种方法。

  1. 过度分配,并将返回的地址四舍五入到所需的路线。

  2. 定义一个具有对齐类型的联合,通常为double。这需要低级知识,但是当您想要分配数组时,这不是最佳的。

  3. Also, you shouldn't cast the return value of malloc() in C

答案 1 :(得分:1)

您是否尝试过posix_memalign

  

函数posix_memalign()分配size个字节,并将分配的内存地址放在*memptr中。分配的内存的地址将是alignment的倍数,必须是a          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()(已废弃):

https://www.kernel.org/doc/man-pages/online/pages/man3/posix_memalign.3.html