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



可能的重复项:
协调内存管理?

有一个数组,我像这样声明

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

int 的大小为 4 字节,但我想确保我的数组从 8 字节边界开始 - 这样我每次都可以有效地加载两个值。有没有其他方法或其他我可以做的事情?

你试过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 manpage 还记录了 aligned_alloc() (c11), memalign() (过时):

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

有几种方法。

  1. 过度分配,并将返回的地址四舍五入为所需的对齐方式。

  2. 定义具有所需对齐方式的类型(通常为 double 的联合)。这需要低级知识,但在要分配数组时不是最佳选择。

此外,不应在 C 中强制转换 malloc() 的返回值。

最新更新