在 GCC 中对齐 malloc()?

问题描述 投票:0回答:5

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

c gcc malloc memory-alignment
5个回答
39
投票

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

void *aligned_alloc(size_t alignment, size_t size);

并且它在 glibc 中可用(据我所知,在 Windows 上不可用)。它采用与

memalign
相同的顺序获取参数,与 Microsoft 的
_aligned_malloc
相反,并使用与通常相同的
free
函数进行释放。

一个微妙的区别是

aligned_alloc
要求
size
alignment
的倍数。


18
投票

[

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

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


11
投票

x86/x64 世界的大多数编译器都支持

_mm_malloc
_mm_free
,至少有:

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

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

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

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


4
投票

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

根据定义,

malloc
保证返回一个正确对齐的指针,用于存储 C 程序中的任何标准类型(以及从标准类型构建的任何类型)。这是您正在寻找的吗?或者你需要一些不同的东西?


0
投票

自 C11(和 C++17)起,有标准库函数

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() 必须能够处理高度对齐的分配。

对于 MSVC 必须使用

_aligned_malloc()
_aligned_free()

但是GCC/G++有这个标准

aligned_alloc()
,至少我在Windows+Cygwin上测试过这个。

© www.soinside.com 2019 - 2024. All rights reserved.