POSIX_MEMALIGN - Linux手册页

时间:2019-08-20 17:59:51  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-08-13

名称

posix_memalign,aligned_alloc,memalign,valloc,pvalloc-分配对齐内存

语法

#include <stdlib.h>

int posix_memalign(void **memptr, size_t alignment, size_t size);
void *aligned_alloc(size_t alignment, size_t size);
void *valloc(size_t size);

#include <malloc.h>

void *memalign(size_t alignment, size_t size);
void *pvalloc(size_t size);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

posix_memalign():_POSIX_C_SOURCE> = 200112L

aligned_alloc():_ ISOC11_SOURCE

valloc():

Since glibc 2.12:
(_XOPEN_SOURCE >= 500) && !(_POSIX_C_SOURCE >= 200112L)
    || /* Glibc since 2.19: */ _DEFAULT_SOURCE
    || /* Glibc versions <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE
Before glibc 2.12:
_BSD_SOURCE || _XOPEN_SOURCE>= 500 ((非标准)头文件还公开了valloc()的声明;不需要功能测试宏。)

说明

函数posix_memalign()分配大小字节,并将分配的内存地址放在* memptr中。分配的内存地址将是对齐方式的倍数,必须是2的幂和sizeof(void )的倍数。此地址以后可以成功传递给free(3)。如果size为0,则放置在memptr中的值为NULL或唯一指针值。

过时的函数memalign()分配大小字节,并返回指向已分配内存的指针。内存地址将是对齐方式的倍数,必须是2的幂。

函数aligned_alloc()与memalign()相同,除了增加了限制,即大小应为比对的倍数。

过时的函数valloc()分配大小字节,并返回指向已分配内存的指针。内存地址将是页面大小的倍数。它等效于memalign(sysconf(_SC_PAGESIZE),size)。

过时的函数pvalloc()与valloc()类似,但是将分配的大小四舍五入到系统页面大小的下一个倍数。

对于所有这些功能,内存不会归零。

返回值

aligned_alloc(),memalign(),valloc()和pvalloc()成功返回一个指向已分配内存的指针。发生错误时,将返回NULL,并设置errno以指示错误原因。

posix_memalign()成功返回零,或者失败下一节列出的错误值之一。未设置errno的值。在Linux(和其他系统)上,posix_memalign()不会在失败时修改memptr。在POSIX.1-2008 TC2中添加了标准化此行为的要求。

错误说明

EINVAL
对齐参数不是2的幂,也不是sizeof(void *)的倍数。
ENOMEM
没有足够的内存来满足分配请求。

版本

至少从glibc 2.0开始,memalign(),valloc()和pvalloc()函数已经可用。

在2.16版中,函数aligned_alloc()已添加到glibc。

从glibc 2.1.91开始,函数posix_memalign()可用。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
aligned_alloc(),
memalign(),
posix_memalign()
Thread safetyMT-Safe
valloc(),
pvalloc()
Thread safetyMT-Unsafe init

遵循规范

函数valloc()出现在3.0BSD中。它被记录为在4.3BSD中已作废,而在SUSv2中已作废。它没有出现在POSIX.1中。

函数pvalloc()是GNU扩展。

函数memalign()出现在SunOS 4.1.3中,而没有出现在4.4BSD中。

函数posix_memalign()来自POSIX.1d,在POSIX.1-2001和POSIX.1-2008中指定。

在C11标准中指定了aligned_alloc()函数。

Headers

每个人都同意posix_memalign()是在中声明的。

在某些系统上,声明了memalign()而不是。

根据SUSv2,valloc()在中声明。 Libc4,5和glibc在中进行了声明,并且在定义了适当的功能测试宏的情况下也进行了声明(请参见上文)。

备注

在许多系统上,例如,用于直接块设备I / O的缓冲区都有对齐限制。 POSIX指定pathconf(path,_PC_REC_XFER_ALIGN)调用,该调用告诉需要什么对齐方式。现在可以使用posix_memalign()满足这一要求。

posix_memalign()验证对齐方式是否符合上述详细要求。 memalign()可能不会检查对齐参数是否正确。

POSIX要求可以使用free(3)释放从posix_memalign()获得的内存。某些系统无法回收用memalign()或valloc()分配的内存(因为只有从malloc(3)获得的指针才能传递给free(3),而例如memalign()会调用malloc(3) ),然后对齐获得的值)。 glibc实现允许使用free(3)回收从任何这些函数获得的内存。

glibc malloc(3)始终返回8字节对齐的内存地址,因此仅当您需要更大的对齐值时才需要这些函数。

另外参见

brk(2),getpagesize(2),free(3),malloc(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/