GCC或glibc中是否有任何标准化函数在对齐指针处分配内存块? 和MSVC中的_align_malloc()一样?
答案 0 :(得分:29)
请参阅memalign系列函数。
答案 1 :(得分:29)
自提出问题以来,C11标准化了一项新功能:
void *aligned_alloc(size_t alignment, size_t size);
并且它在glibc中可用(据我所知,不在Windows上)。它的参数与memalign
的顺序相同,与Microsoft的_aligned_malloc
相反,并且使用与常规相同的free
函数进行重新分配。
一个微妙的区别是aligned_alloc
要求size
是alignment
的倍数。
答案 2 :(得分:19)
[
posix_memalign()
] [1]函数提供对齐的内存分配和 自glibc 2.1.91以来一直可用。
但不一定与其他编译器一样:引用标准 “posix_memalign()函数是”咨询信息“选项的一部分,无需在所有实现中提供。”
答案 3 :(得分:11)
x86 / x64世界的大多数编译器都支持_mm_malloc
和_mm_free
,至少包含:
AFAIK,这些功能根本不是标准。但据我所知,支持最多的是它。其他函数更具体编译器:
还有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 上测试过。