kazmax - Linux で自宅サーバー

posix_memalign - ライブラリコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 注意
  7. 可用性
  8. 準拠
  9. ヘッダ
  10. 関連項目

名前

posix_memalign, memalign, valloc - アラインメントされたメモリの割り当てを行う

書式

#define _XOPEN_SOURCE 600#include <stdlib.h>

int posix_memalign(void **memptr, size_t alignment, size_t size);
#include <malloc.h>
void *valloc(size_t size);void *memalign(size_t boundary, size_t size);

説明

関数 posix_memalign ()は size バイトのメモリを割り当て、割り当てられたメモリのアドレスを *memptr に設定する。 割り当てられたメモリのアドレスは alignment の倍数になっているはずである。 alignment は 2 のべき乗で、かつ sizeof(void *) の倍数でなければならない。
廃止された関数である memalign ()は、 size バイトのメモリを割り当て、割り当てられたメモリへのポインタを返す。 メモリのアドレスは boundary の倍数になっているはずである。 boundary は 2 のべき乗でなければならない。
廃止された関数である valloc ()は size バイトのメモリを割り当て、割り当てられたメモリへのポインタを返す。 メモリのアドレスはページサイズの倍数になっているはずである。 これは memalign(sysconf(_SC_PAGESIZE),size) と等価である。
3 つの関数はいずれもメモリのゼロクリアを行わない。

返り値

memalign ()と valloc ()は割り当てられたメモリへのポインタを返す。 割り当てに失敗した場合は NULL を返す。
posix_memalign ()は成功した場合は 0 を返し、 失敗した場合は次のセクションに記載されたエラー値のいずれかを返す。 errno はセットされないことに注意すること。

エラー

EINVAL
alignment パラメータが 2 のべき乗でなかったか、 sizeof(void *) の倍数でなかった。
ENOMEM
割り当て要求を満たすのに十分なメモリがなかった。

注意

多くのシステムでは、アラインメントに関して制限がある。例えば、 ブロックデバイスに対するダイレクト I/O に使用するバッファには アラインメントに関する制限がある。 POSIX では、どんなアラインメントが必要かを知るために "pathconf(path,_PC_REC_XFER_ALIGN)" コールを規定している。ここで posix_memalign ()を使うと、この必要条件を満たすことができる。
posix_memalign ()は alignment が上で詳細に述べた必要条件を満たすかどうかを確かめる。 memalign ()は boundary パラメータが正しいかどうかの確認を行わないかもしれない。
POSIX では posix_memalign ()によって獲得したメモリは free ()を使って解放することができる必要がある。 いくつかのシステムでは memalign ()や valloc ()で割り当てられたメモリを再利用する手段が提供されていない。 (なぜなら free ()に渡すことができるのは malloc ()から受け取ったポインタだけだが、 例えば memalign ()は malloc ()を呼び出し、得た値をアラインメントしてしまうからである) GNU libc では ここに述べた 3 つの関数のいずれで獲得したメモリも free ()で再利用することができる。
GNU libc の malloc ()は常に 8 バイトにアラインメントされたメモリアドレスを返すので、 ここで述べた関数が必要になるのは 8 バイトよりも大きなアラインメントが必要な場合だけである。

可用性

memalign ()と valloc ()はすべての Linux libc ライブラリで使用可能である。 posix_memalign ()は glibc 2.1.91 以降で使用可能である。

準拠

関数 valloc ()は 3.0BSD で登場した。4.3BSD では廃止されたと記載されており、 SUSv2 では過去のものだと記載されている。 POSIX.1-2001 にはもはや存在しない。 関数 memalign ()は SunOS 4.1.3 で登場したが、4.4BSD にはない。 関数 posix_memalign ()は POSIX.1d に由来する。

ヘッダ

posix_memalign ()の宣言を <stdlib.h> で行うことに関しては、皆の意見が一致している。 この関数を宣言するには、 glibc では _GNU_SOURCE を定義する、または _XOPEN_SOURCE を 600 より小さくない値に定義する、のいずれかを行う 必要がある。
いくつかのシステムでは、 memalign ()は <malloc.h> ではなく <stdlib.h> で宣言されている。
SUSv2 によると、 valloc ()は <stdlib.h> で宣言される。 libc4,5 や glibc では <malloc.h> で宣言されており、 さらに <stdlib.h> でも宣言されることもある (具体的には以下のいずれかの場合: _GNU_SOURCE が定義されている、_BSD_SOURCE が定義されている、 glibc で _XOPEN_SOURCE_EXTENDED が定義されている、 glibc で _XOPEN_SOURCE が 500 より小さくない値に定義されている)。

関連項目