GCC或glibc中有没有标准化的函数来分配对齐指针的内存块?比如MSVC中的_align_malloc()?
vm0i2vca1#
既然提出了这个问题,C11就标准化了一个新的函数:
void *aligned_alloc(size_t alignment, size_t size);
它可以在glibc中使用(据我所知,在windows中没有),它的参数顺序与memalign相同,与微软的_aligned_malloc相反,并且使用与通常相同的free函数进行释放。一个细微的差别是aligned_alloc要求size是alignment的倍数。
memalign
_aligned_malloc
free
aligned_alloc
size
alignment
i1icjdpr2#
参见memalign系列函数。
isr3a4wc3#
[ posix_memalign() ][1]函数提供对齐的内存分配,从glibc 2.1.91开始就可用。但不一定与其他编译器:引用标准“posix_memalign()函数是Advisory Information选项的一部分,不需要在所有实现中提供。”
posix_memalign()
lnvxswe24#
_mm_malloc和_mm_free是x86/x64世界中大多数编译器都支持的,它们至少具有:
_mm_malloc
_mm_free
答:这些函数根本不是标准的。但据我所知,它们是最受支持的函数。其他函数更适合编译器:
也有C11标准函数,但不幸的是,它们不在C11中,并且将它们包含在C中需要非标准的预处理器定义...
qnyhuwrf5#
这取决于你期望什么样的对齐。你想要更严格的对齐,还是更宽松的对齐?malloc的定义保证返回一个指针,该指针正确对齐以存储C程序中的任何标准类型(因此,任何从标准类型构建的类型)。这是您正在寻找的吗?或者您需要一些不同的东西吗?
malloc
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上测试过这个。
#include <cstdlib>
std::aligned_alloc()
6条答案
按热度按时间vm0i2vca1#
既然提出了这个问题,C11就标准化了一个新的函数:
它可以在glibc中使用(据我所知,在windows中没有),它的参数顺序与
memalign
相同,与微软的_aligned_malloc
相反,并且使用与通常相同的free
函数进行释放。一个细微的差别是
aligned_alloc
要求size
是alignment
的倍数。i1icjdpr2#
参见memalign系列函数。
isr3a4wc3#
[
posix_memalign()
][1]函数提供对齐的内存分配,从glibc 2.1.91开始就可用。但不一定与其他编译器:引用标准“posix_memalign()函数是Advisory Information选项的一部分,不需要在所有实现中提供。”
lnvxswe24#
_mm_malloc
和_mm_free
是x86/x64世界中大多数编译器都支持的,它们至少具有:答:这些函数根本不是标准的。但据我所知,它们是最受支持的函数。其他函数更适合编译器:
也有C11标准函数,但不幸的是,它们不在C11中,并且将它们包含在C中需要非标准的预处理器定义...
qnyhuwrf5#
这取决于你期望什么样的对齐。你想要更严格的对齐,还是更宽松的对齐?
malloc
的定义保证返回一个指针,该指针正确对齐以存储C程序中的任何标准类型(因此,任何从标准类型构建的类型)。这是您正在寻找的吗?或者您需要一些不同的东西吗?nhaq1z216#
自C++17起,存在标准库函数std::aligned_alloc(),其签名为:
必须使用
#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上测试过这个。