#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():
(_XOPEN_SOURCE >= 500) && !(_POSIX_C_SOURCE >= 200112L) || /* glibc 2.19 以降: */ _DEFAULT_SOURCE || /* glibc 2.19 以前: */ _SVID_SOURCE || _BSD_SOURCE
廃止された関数である memalign() は、 size バイトのメモリーを割り当て、 割り当てられたメモリーへのポインターを返す。 メモリーのアドレスは alignment の倍数になっているはずである。 alignment は 2 のべき乗でなければならない。
関数 aligned_alloc() は memalign() と同じだが、size が alignment の倍数でなければならないという追加の制限がある点が異なる。
廃止された関数である valloc() は size バイトのメモリーを割り当て、割り当てられたメモリーへのポインターを返す。 メモリーのアドレスはページサイズの倍数になっているはずである。 これは memalign(sysconf(_SC_PAGESIZE),size) と等価である。
廃止された関数 pvalloc() は valloc() と同様だが、 割り当てられるサイズがシステムのページサイズの倍数に切り上げられる。
posix_memalign() returns zero on success, or one of the error values listed in the next section on failure. The value of errno is not set. On Linux (and other systems), posix_memalign() does not modify memptr on failure. A requirement standardizing this behavior was added in POSIX.1-2008 TC2.
関数 aligned_alloc() は glibc バージョン 2.16 で追加された。
関数 posix_fallocate() は glibc 2.1.91 以降で利用可能である。
インターフェース | 属性 | 値 |
aligned_alloc(),
memalign(), posix_memalign() | Thread safety | MT-Safe |
valloc(),
pvalloc() | Thread safety | MT-Unsafe init |
関数 pvalloc() は GNU による拡張である。
関数 memalign() は SunOS 4.1.3 で登場したが、4.4BSD にはない。
関数 posix_memalign() は POSIX.1d に由来し、 POSIX.1-2001 と POSIX.1-2008 で規定されている。
関数 aligned_alloc() は C11 標準で規定されている。
いくつかのシステムでは、 memalign() は <malloc.h> ではなく <stdlib.h> で宣言されている。
SUSv2 によると、 valloc() は <stdlib.h> で宣言される。 glibc では <malloc.h> で宣言されており、 さらに適切な機能検査マクロが定義された場合には <stdlib.h> でも宣言される(上記を参照)。
posix_memalign() は alignment が上で詳細に述べた必要条件を満たすか どうかを確かめる。 memalign() は alignment 引数が正しいかどうかの 確認を行わないかもしれない。
POSIX では posix_memalign() によって獲得したメモリーは free(3) を 使って解放することができる必要がある。 いくつかのシステムでは memalign() やvalloc() で割り当てられたメモリーを再利用する手段が 提供されていない(なぜなら free(3) に渡すことができるのは malloc(3) から受け取ったポインターだけだが、例えば memalign() は malloc(3) を呼び出し、得た値をアラインメントしてしまうからである)。 glibc の実装では、 ここに述べた関数のいずれで獲得したメモリーも free(3) で再利用することができる。
glibc の malloc(3) は常に 8 バイトにアラインメントされたメモリーアドレスを 返すので、ここで述べた関数が必要になるのは 8 バイトよりも大きなアラインメント が必要な場合だけである。