名前空間
変種
操作

aligned_alloc

From cppreference.com
ヘッダー <stdlib.h> で定義
void *aligned_alloc( size_t alignment, size_t size );
(C11 以降)

size バイトの初期化されていないストレージを、alignment で指定されたアライメントで確保します。size パラメータは alignment の整数倍である必要があります。

aligned_alloc はスレッドセーフです。引数を通して可視なメモリ位置のみにアクセスし、静的ストレージにはアクセスしないかのように動作します。

以前の freefree_sized、および free_aligned_sized(C23以降) または realloc によるメモリ領域の解放は、同じまたはその一部のメモリ領域を確保する aligned_alloc の呼び出しと *同期* します。この同期は、解放関数によるメモリへのアクセス後、かつ aligned_alloc によるメモリへのアクセス前に行われます。特定のメモリ領域で動作するすべての確保および解放関数の単一の全体的な順序が存在します。

目次

[編集] Parameters

alignment - アライメントを指定します。実装でサポートされている有効なアライメントである必要があります。
size - 確保するバイト数。alignment の整数倍

[編集] Return value

成功した場合、新しく確保されたメモリの先頭へのポインタを返します。メモリリークを避けるため、返されたポインタは free または realloc で解放する必要があります。

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

[編集] Notes

sizealignment の整数倍でない場合、または alignment が無効であるか実装でサポートされていない場合、関数は失敗し、ヌルポインタを返します(C11、公表版ではこの場合未定義の動作を指定していましたが、DR460 によって修正されました)。restrictive なアライメント境界での小さなオブジェクトの確保を可能にするためのサイズ制限の削除(alignas に似ています)は、N2072 によって提案されました。

「実装でサポートされている」という要件の例として、POSIX 関数 posix_memalign は、2 のべき乗であり sizeof(void *) の倍数である任意の alignment を受け入れます。また、POSIX ベースの実装の aligned_alloc はこの要件を引き継ぎます。

基本的なアライメントは常にサポートされます。 alignment が 2 のべき乗であり、 _Alignof(max_align_t) 以下である場合、 aligned_alloc は単純に malloc を呼び出すことがあります。

通常の malloc は、基本的なアライメントを持つ任意のオブジェクト型に適したメモリをアライメントします。 aligned_alloc は、SSE、キャッシュライン、または VM ページ境界へのオーバーアライメント確保に役立ちます。

この関数は、Microsoft C Runtime ライブラリではサポートされていません。これは、std::free の実装がいかなる種類のアライメント確保も *処理できない* ためです。代わりに、MS CRT は _aligned_malloc_aligned_free で解放する必要があります)を提供しています。

[編集] Example

#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

[編集] References

  • C23標準 (ISO/IEC 9899:2024)
  • 7.22.3.1 The aligned_alloc function (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 7.22.3.1 The aligned_alloc function (p: 253)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.22.3.1 The aligned_alloc function (p: 347-348)

[編集] See also

C++ ドキュメント for aligned_alloc
English 日本語 中文(简体) 中文(繁體)