GCC或glibc中是否有标准化函数来在对齐指针处分配内存块? 就像 MSVC 中的 _align_malloc() 吗?
问题提出后,C11标准化了一个新功能:
void *aligned_alloc(size_t alignment, size_t size);
并且它在 glibc 中可用(据我所知,在 Windows 上不可用)。它采用与
memalign
相同的顺序获取参数,与 Microsoft 的 _aligned_malloc
相反,并使用与通常相同的 free
函数进行释放。
一个微妙的区别是
aligned_alloc
要求 size
是 alignment
的倍数。
[
][1]函数提供对齐的内存分配和 自 glibc 2.1.91 起可用。posix_memalign()
但不一定与其他编译器一起使用:引用标准 “posix_memalign() 函数是咨询信息选项的一部分,不需要在所有实现中提供。”
x86/x64 世界的大多数编译器都支持
_mm_malloc
和 _mm_free
,至少有:
AFAIK,这些功能根本不是标准。但据我所知,这是最受支持的。其他函数更特定于编译器:
还有 C11 标准函数,但不幸的是它们不在 c++11 中,并且将它们包含在 c++ 中需要非标准预处理器定义...
这取决于您期望什么样的对齐方式。您想要更严格的对齐,还是更宽松的对齐?
根据定义,malloc
保证返回一个正确对齐的指针,用于存储 C 程序中的任何标准类型(以及从标准类型构建的任何类型)。这是您正在寻找的吗?或者你需要一些不同的东西?
aligned_alloc()
,其签名为:
void *aligned_alloc( size_t alignment, size_t size );
您必须
#include <stdlib.h>
才能使用它。 size
参数必须是 alignment
的倍数。失败时返回空指针。使用 std::free()
释放分配的指针。
虽然并非所有编译器可能都实现了这个标准函数。例如,MSVC 出于下一个原因没有实现它(请阅读here):
MSVC不支持aligned_alloc函数。 C11 以与 Microsoft 的 free() 实现不兼容的方式指定aligned_alloc(),即 free() 必须能够处理高度对齐的分配。
_aligned_malloc()
和 _aligned_free()
。
但是GCC/G++有这个标准
aligned_alloc()
,至少我在Windows+Cygwin上测试过这个。