在GCC中对齐malloc()?

Den*_*hev 36 c malloc gcc

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

sig*_*ice 29

请参阅memalign函数系列.


Mar*_*sse 29

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

void *aligned_alloc(size_t alignment, size_t size);
Run Code Online (Sandbox Code Playgroud)

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

一个微妙的区别是aligned_alloc需要size倍数alignment.


jsc*_*ier 19

[ posix_memalign()] [1]函数提供对齐的内存分配,自glibc 2.1.91起可用.

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


gal*_*tte 11

_mm_malloc_mm_free它是由在x86/x64世界上大多数编译器的支持,至少有:

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

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

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

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


AnT*_*AnT 4

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

malloc根据定义,保证返回一个正确对齐的指针,用于存储 C 程序中的任何标准类型(以及从标准类型构建的任何类型)。这是您正在寻找的吗?或者你需要一些不同的东西?

  • 一个常见的问题是 SIMD 类型(如 SSE 向量)不被视为“标准类型”,因此它们比“malloc”提供的对齐要求更严格。 (18认同)
  • @ninto2k01:缓存行要小得多,例如 x86 上的 32 行和 amd64 上的 64 行。OTOH 页面为 4k。 (6认同)