名前空間
変種
操作

aligned_alloc

提供: cppreference.com
< c‎ | memory
ヘッダ <stdlib.h> で定義
void *aligned_alloc( size_t alignment, size_t size );
(C11以上)

alignment で指定されたアライメントを持つ size バイトの未初期化記憶域を確保します。 size 引数は alignment の整数倍でなければなりません。

aligned_alloc はスレッドセーフです。 引数を通して可視となるメモリ位置にのみアクセスし、いかなる静的記憶域にもアクセスしないかのように振る舞います。

メモリ領域を解放する free または realloc の以前の呼び出しは、同じメモリ領域またはその一部を確保する aligned_alloc の呼び出しに対して同期します。 この同期は解放関数によるそのメモリに対するいかなるアクセスよりも後でかつ aligned_alloc によるそのメモリに対するいかなるアクセスよりも前に発生します。 個々の特定のメモリ領域を操作するすべての確保関数および解放関数に単一の全順序が存在します。

目次

[編集] 引数

alignment - アライメントを指定します。 処理系がサポートしている有効なアライメントでなければなりません
size - 確保するバイト数。 alignment の整数倍でなければなりません

[編集] 戻り値

成功した場合は、新たに確保されたメモリの先頭を指すポインタを返します。 メモリリークを避けるためには、返されたポインタは free() または realloc() で解放しなければなりません。

失敗した場合は、ヌルポインタを返します。

[編集] ノート

alignment の整数倍でない size を渡したり、有効でないまたは処理系がサポートしていない alignment を渡したりすると、関数は失敗し、ヌルポインタを返します (このケースは C11 の発行時点では未定義動作と規定されていましたが、 DR 460 で訂正されました)。 小さなオブジェクトをより厳しいアライメント境界で割り当てる (alignas と同様に) ことができるようサイズの制約を除去することが n2072 で提案されています。

「処理系がサポートしている」の例として、 POSIX の関数 posix_memalign は2の乗数かつ sizeof(void *) の倍数である任意の alignment を受理します。 POSIX ベースの処理系の aligned_alloc はこの要求を引き継いでいます。

通常の malloc はあらゆるオブジェクト型に適したメモリアライメントを行います (これは実質的には alignof(max_align_t) にアラインすることを意味しています)。 aligned_alloc は SSE やキャッシュライン、あるいは仮想メモリのページ境界などに対する過剰にアラインされた確保のために役に立ちます。

[編集]

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int *p1 = malloc(10*sizeof *p1);
    printf("default-aligned addr:   %p\n", (void*)p1);
    free(p1);
 
    int *p2 = aligned_alloc(1024, 1024*sizeof *p2);
    printf("1024-byte aligned addr: %p\n", (void*)p2);
    free(p2);
}

出力例:

default-aligned addr:   0x1e40c20
1024-byte aligned addr: 0x1e41000

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.22.3.1 The aligned_alloc function (p: 347-348)

[編集] 関連項目

aligned_allocC++リファレンス