Provided by: manpages-ja-dev_0.5.0.0.20180315+dfsg-1_all bug

名前

       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() と同じだが、sizealignment の倍数でなければならないという追加の制限
       がある点が異なる。

       廃止された関数である 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/ に書かれている。