GCC中对齐的malloc()?

utugiqy6  于 2022-12-26  发布在  其他
关注(0)|答案(6)|浏览(205)

GCC或glibc中有没有标准化的函数来分配对齐指针的内存块?比如MSVC中的_align_malloc()

vm0i2vca

vm0i2vca1#

既然提出了这个问题,C11就标准化了一个新的函数:

void *aligned_alloc(size_t alignment, size_t size);

它可以在glibc中使用(据我所知,在windows中没有),它的参数顺序与memalign相同,与微软的_aligned_malloc相反,并且使用与通常相同的free函数进行释放。
一个细微的差别是aligned_alloc要求sizealignment的倍数。

isr3a4wc

isr3a4wc3#

[ posix_memalign() ][1]函数提供对齐的内存分配,从glibc 2.1.91开始就可用。
但不一定与其他编译器:引用标准“posix_memalign()函数是Advisory Information选项的一部分,不需要在所有实现中提供。”

lnvxswe2

lnvxswe24#

_mm_malloc_mm_free是x86/x64世界中大多数编译器都支持的,它们至少具有:

  • 海合会
  • 明网网关(gcc win32/win 64)
  • MSVC语言
  • 金属撞击声
  • 国际商会

答:这些函数根本不是标准的。但据我所知,它们是最受支持的函数。其他函数更适合编译器:

  • _aligned_malloc仅适用于MSVC和MinGW
  • posix memalign函数至少不受MSVC支持

也有C11标准函数,但不幸的是,它们不在C11中,并且将它们包含在C中需要非标准的预处理器定义...

qnyhuwrf

qnyhuwrf5#

这取决于你期望什么样的对齐。你想要更严格的对齐,还是更宽松的对齐?
malloc的定义保证返回一个指针,该指针正确对齐以存储C程序中的任何标准类型(因此,任何从标准类型构建的类型)。这是您正在寻找的吗?或者您需要一些不同的东西吗?

nhaq1z21

nhaq1z216#

自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指定aligned_alloc()的方式与free()的Microsoft实现不兼容,即free()必须能够处理高度对齐的分配。
对于MSVC,必须使用_aligned_malloc()_aligned_free()
但是GCC/G++有这个标准的std::aligned_alloc(),至少我在Windows+Cygwin上测试过这个。

相关问题