Provided by: manpages-ja-dev_0.5.0.0.20210215+dfsg-1_all
名前
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 || _XOPEN_SOURCE >= 600 aligned_alloc(): _ISOC11_SOURCE valloc(): glibc 2.12 以降: _BSD_SOURCE || (_XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && !(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) glibc 2.12 より前: _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED ((非標準の) ヘッダーファイル <malloc.h> も valloc() の宣言も公開する。機能検査マク ロは不要である。
説明
関数 posix_memalign() は、 size バイトのメモリーを割り当て、割り当てられたメモリーのアド レスを *memptr に設定する。 割り当てられたメモリーのアドレスは alignment の倍数になってい るはずである。 alignment は 2 のべき乗で、かつ sizeof(void *) の倍数でなければならない。 size が 0 の場合、 *memptr には NULL か一意なポインター値が書かれる。 このポインター値 は、後で free(3) に問題なく渡すことができる。 廃止された関数である memalign() は、 size バイトのメモリーを割り当て、 割り当てられたメモ リーへのポインターを返す。 メモリーのアドレスは alignment の倍数になっているはずである。 alignment は 2 のべき乗でなければならない。 関数 aligned_alloc() は memalign() と同じだが、size が alignment の倍数でなければならない という追加の制限がある点が異なる。 廃止された関数である valloc() は size バイトのメモリーを割り当て、割り当てられたメモリー へのポインターを返す。 メモリーのアドレスはページサイズの倍数になっているはずである。 これ は memalign(sysconf(_SC_PAGESIZE),size) と等価である。 廃止された関数 pvalloc() は valloc() と同様だが、 割り当てられるサイズがシステムのページサ イズの倍数に切り上げられる。 これらの関数はいずれもメモリーのゼロクリアを行わない。
返り値
aligned_alloc(), memalign(), valloc(), pvalloc() は割り当てられた メモリーへのポインターを 返す。 割り当てに失敗した場合は NULL を返す。 posix_memalign() は成功した場合は 0 を返し、 失敗した場合は次のセクションに記載されたエ ラー値のいずれかを返す。 posix_memalign() の呼び出し後は errno の値は不定である。
エラー
EINVAL alignment 引き数が 2 のべき乗でなかったか、 sizeof(void *) の倍数でなかった。 ENOMEM 割り当て要求を満たすのに十分なメモリーがなかった。
バージョン
関数 memalign(), valloc(), pvalloc() は すべての Linux libc ライブラリで使用可能である。 関数 aligned_alloc() は glibc バージョン 2.16 で追加された。 関数 posix_fallocate() は glibc 2.1.91 以降で利用可能である。
準拠
関数 valloc() は 3.0BSD で登場した。4.3BSD では廃止されたと記載されており、 SUSv2 では過去 の名残だと記載されている。 POSIX.1-2001 には存在しない。 関数 pvalloc() は GNU による拡張である。 関数 memalign() は SunOS 4.1.3 で登場したが、4.4BSD にはない。 関数 posix_memalign() は POSIX.1d に由来する。 関数 aligned_alloc() は C11 標準で規定されている。 ヘッダー posix_memalign() の宣言を <stdlib.h> で行うことに関しては、 皆の意見が一致している。 いくつかのシステムでは、 memalign() は <malloc.h> ではなく <stdlib.h> で宣言されている。 SUSv2 によると、 valloc() は <stdlib.h> で宣言される。 libc4,5 や glibc では <malloc.h> で 宣言されており、 さらに適切な機能検査 マクロが定義された場合には <stdlib.h> でも宣言され る(上記を参照)。
注意
多くのシステムでは、アラインメントに関して制限がある。例えば、 ブロックデバイスに対するダ イレクト I/O に使用するバッファーには アラインメントに関する制限がある。 POSIX では、どん なアラインメントが必要かを知るために pathconf(path,_PC_REC_XFER_ALIGN) コールを規定してい る。ここで posix_memalign() を使うと、この必要条件を満たすことができる。 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 バイトよりも大きなアラインメント が必要な場合だけである。
関連項目
brk(2), getpagesize(2), free(3), malloc(3)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。