【发布时间】:2014-05-15 11:35:48
【问题描述】:
在 GCC 或 glibc 中是否有任何标准化函数可以在对齐的指针处分配内存块? 像 MSVC 中的 _align_malloc()?
【问题讨论】:
-
stdlib 唯一版本stackoverflow.com/questions/227897/…
在 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 的倍数。
【讨论】:
查看memalign 系列函数。
【讨论】:
[
posix_memalign()][1] 函数提供对齐的内存分配和 从 glibc 2.1.91 开始可用。
但不一定与其他编译器:引用标准 “posix_memalign() 函数是咨询信息选项的一部分,不需要在所有实现中提供。”
【讨论】:
x86/x64 世界的大多数编译器都支持_mm_malloc 和_mm_free,至少:
AFAIK,这些功能根本不是标准。但据我所知,这是最受支持的。其他函数更特定于编译器:
还有 C11 标准函数,但不幸的是它们不在 c++11 中,并且在 c++ 中包含它们需要非标准的预处理器定义...
【讨论】:
这取决于您期望的对齐方式。您想要更严格的对齐方式还是更宽松的对齐方式?
malloc 根据定义保证返回一个正确对齐的指针,用于存储 C 程序中的任何标准类型(因此,任何从标准类型构建的类型)。是你要找的吗?还是您需要不同的东西?
【讨论】:
malloc 提供的对齐要求更严格。
n 而不是n+1 L1 高速缓存行(通常大小为 4096 字节左右),您平均可以获得更快的内存访问。对于某些应用程序,比如音频处理,缓冲区是 L1 缓存行的大小,或者是该大小的小倍数,这可能会产生很大的不同。
自 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() 的方式与Microsoft 的free() 实现不兼容,即free() 必须能够处理高度对齐的分配。
对于 MSVC,必须使用 _aligned_malloc() 和 _aligned_free()。
但是 GCC/G++ 有这个标准std::aligned_alloc(),至少我在 Windows+Cygwin 上测试过这个。
【讨论】: