在C中对齐动态内存中数组的开头[重复]

Posted

技术标签:

【中文标题】在C中对齐动态内存中数组的开头[重复]【英文标题】:Align the start of an array in dynamic memory in C [duplicate] 【发布时间】:2012-09-10 19:30:11 【问题描述】:

可能重复:Aligned memory management?

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

int * myarray;
int num_of_element;

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

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

【问题讨论】:

【参考方案1】:

你试过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()(已过时):

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

【讨论】:

【参考方案2】:

有几种方法。

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

    定义一个联合类型,其对齐方式是所需的类型,通常为double。这需要底层知识,但在您想要分配数组时不是最佳选择。

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

【讨论】:

calloc 是否已经确保返回的指针与所有可能的类型对齐,包括双精度类型? 是的,至少在 BSD 和 Linux 上是这样。 @PiotrKalinowski

以上是关于在C中对齐动态内存中数组的开头[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++11 中的动态对齐内存分配

内存位置作为放大动态数组中的最后一个值[重复]

二维数组动态内存分配崩溃[重复]

C笔记--动态内存

C笔记--动态内存

C之动态内存分配(三十四)