在GCC中对齐malloc()?

时间:2010-10-01 14:08:29

标签: c gcc malloc

GCC或glibc中是否有任何标准化函数在对齐指针处分配内存块? 和MSVC中的_align_malloc()一样?

6 个答案:

答案 0 :(得分:29)

请参阅memalign系列函数。

答案 1 :(得分:29)

自提出问题以来,C11标准化了一项新功能:

void *aligned_alloc(size_t alignment, size_t size);

并且它在glibc中可用(据我所知,不在Windows上)。它的参数与memalign的顺序相同,与Microsoft的_aligned_malloc相反,并且使用与常规相同的free函数进行重新分配。

一个微妙的区别是aligned_alloc要求sizealignment的倍数。

答案 2 :(得分:19)

  

[posix_memalign()] [1]函数提供对齐的内存分配和   自glibc 2.1.91以来一直可用。

但不一定与其他编译器一样:引用标准 “posix_memalign()函数是”咨询信息“选项的一部分,无需在所有实现中提供。”

答案 3 :(得分:11)

x86 / x64世界的大多数编译器都支持_mm_malloc_mm_free,至少包含:

  • GCC
  • MinGW(gcc win32 / win64)
  • MSVC
  • ICC

AFAIK,这些功能根本不是标准。但据我所知,支持最多的是它。其他函数更具体编译器:

  • _aligned_malloc仅限MSVC和MinGW
  • 至少MSVC 不支持
  • posix memalign函数

还有C11标准函数,但遗憾的是它们不在c ++ 11中,并且在c ++中包含它们需要非标准的预处理器定义......

答案 4 :(得分:4)

这取决于您期望的对齐方式。你想要更严格的对齐,还是更宽松的对齐?

根据定义,

malloc保证返回一个正确对齐的指针,用于在C程序中存储任何标准类型(因此,任何类型都是从标准类型构建的)。这是你在找什么?或者你需要不同的东西吗?

答案 5 :(得分:0)

从 C++17 开始,就有了带有签名的标准库函数 std::aligned_alloc()

void* aligned_alloc( std::size_t alignment, std::size_t size );

您必须#include <cstdlib> 才能使用它。 size 参数必须是 alignment 的倍数。失败时返回空指针。使用 std::free() 释放分配的指针。

虽然不是所有的编译器都实现了这个标准功能。例如,由于下一个原因,MSVC 没有实现它(阅读 here):

<块引用>

MSVC 不支持aligned_alloc 函数。 C11 以一种与 Microsoft 的 free() 实现不兼容的方式指定了aligned_alloc(),即 free() 必须能够处理高度对齐的分配。

对于 MSVC,必须使用 _aligned_malloc()_aligned_free()

但是 GCC/G++ 有这个标准 std::aligned_alloc(),至少我在 Windows+Cygwin 上测试过。