【问题标题】:aligned malloc() in GCC?在 GCC 中对齐 malloc()?
【发布时间】:2014-05-15 11:35:48
【问题描述】:

在 GCC 或 glibc 中是否有任何标准化函数可以在对齐的指针处分配内存块? 像 MSVC 中的 _align_malloc()

【问题讨论】:

标签: c gcc malloc


【解决方案1】:

自从提出问题后,C11 标准化了一个新功能:

void *aligned_alloc(size_t alignment, size_t size);

它在 glibc 中可用(据我所知,不在 Windows 上)。它以与memalign 相同的顺序获取其参数,与Microsoft 的_aligned_malloc 相反,并像往常一样使用相同的free 函数进行释放。

一个细微的区别是aligned_alloc 要求sizealignment 的倍数。

【讨论】:

    【解决方案2】:

    查看memalign 系列函数。

    【讨论】:

      【解决方案3】:

      [posix_memalign()][1] 函数提供对齐的内存分配和 从 glibc 2.1.91 开始可用。

      但不一定与其他编译器:引用标准 “posix_memalign() 函数是咨询信息选项的一部分,不需要在所有实现中提供。”

      【讨论】:

        【解决方案4】:

        x86/x64 世界的大多数编译器都支持_mm_malloc_mm_free,至少:

        • 海合会
        • MinGW (gcc win32/win64)
        • MSVC
        • 叮当
        • 国际商会

        AFAIK,这些功能根本不是标准。但据我所知,这是最受支持的。其他函数更特定于编译器:

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

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

        【讨论】:

          【解决方案5】:

          这取决于您期望的对齐方式。您想要更严格的对齐方式还是更宽松的对齐方式?

          malloc 根据定义保证返回一个正确对齐的指针,用于存储 C 程序中的任何标准类型(因此,任何从标准类型构建的类型)。是你要找的吗?还是您需要不同的东西?

          【讨论】:

          • 一个常见的问题是 SIMD 类型(如 SSE 向量)不被视为“标准类型”,因此它们比malloc 提供的对齐要求更严格。
          • 想要这样做的另一个原因是性能。通过对齐数据结构使其跨越n 而不是n+1 L1 高速缓存行(通常大小为 4096 字节左右),您平均可以获得更快的内存访问。对于某些应用程序,比如音频处理,缓冲区是 L1 缓存行的大小,或者是该大小的小倍数,这可能会产生很大的不同。
          • @nitro2k01:缓存行要小得多,例如x86 上为 32,amd64 上为 64。 OTOH 页面为 4k。
          【解决方案6】:

          自 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 上测试过这个。

          【讨论】:

            猜你喜欢
            • 2015-05-19
            • 1970-01-01
            • 2018-07-22
            • 1970-01-01
            • 2013-08-31
            • 2017-06-27
            • 2010-09-07
            • 2019-01-26
            相关资源
            最近更新 更多