posix_memalign解析

1628 ワード

転載:http://hi.baidu.com/freelonely/blog/item/340341077c4d287302088189.html
プリアライメントメモリの割り当て
ほとんどの場合、コンパイラとCライブラリは、配置問題を透明に処理してくれます.POSIXはmalloc()を通じて表記しています. caloc()と realloc() 返信されたアドレスは、任意のCタイプに対して配置されます.
Linuxでは、これらの関数が返したアドレスは32ビットシステムで8バイトを境界として配置され、64ビットシステムでは16バイトを境界として配置されている.
場合によっては、ページなどのより大きな境界に対して、プログラマは動的な配置を必要とする.動機は多様であるが、最も一般的なのは、直接ブロックI/Oキャッシュの整列または他のソフトウェアのハードウェアへのインタラクションであるので、POSIX 1003.1 dは、posix_というソフトウェアを提供する.memalign()の関数:
/* one or the other -- either suffices */
#define _XOPEN_SOURCE 600
#define _GNU_SOURCE
#include 
int posix_memalign (void **memptr,
                    size_t alignment,
                    size_t size);
* See http://perens.com/FreeSoftware/ElectricFence/ and http://valgrind.org, respectively.
posix_を呼び出しますmemalign()が成功するとsizeバイトのダイナミックメモリに戻ります.このメモリのアドレスはalignmentの倍数です.引数alignmentは、2のべきか、またはvoidポインタの大きさの倍数でなければなりません.戻ってきたメモリブロックのアドレスをmemptrに入れました.関数の戻り値は0です.
起動に失敗した場合、メモリがないと割り当てられます.mptrの値は定義されていません.次のエラーコードの一つを返します.
エイドVAL
パラメータは2のべき乗ではなく、またはvoidポインタの倍数ではありません.
ENOMEM
関数の要求を満たすには十分なメモリがありません.
なお、この関数に対しては、errnoは設定されず、戻り値のみが設定されている.
posix_memalign()で得られたメモリはfree()で放出される.使い方は簡単です
char *buf;
int ret;
/* allocate 1 KB along a 256-byte boundary */
ret = posix_memalign (&buf, 256, 1024);
if (ret) {
    fprintf (stderr, "posix_memalign: %s
", strerror (ret)); return -1; } /* use 'buf'... */ free (buf);
Refer:1.関数APIの説明 https://pubs.opengroup.org/onlinepubs/007904975/functions/posix_memalign.