Namespaces
Variants

aligned_alloc

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

アライメント alignment で指定された整列を持つ、未初期化ストレージを size バイト割り当てます。 size パラメータは alignment の整数倍でなければなりません。

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

以前の free free_sized および free_aligned_sized (C23以降) または realloc の呼び出しでメモリ領域を解放する操作は、 aligned_alloc が同じメモリ領域全体または一部を割り当てる呼び出しと 同期する 。この同期は、解放関数によるメモリへのアクセスがすべて完了した後、かつ aligned_alloc によるメモリへのアクセスが行われる前に発生する。各特定のメモリ領域に対して動作する全ての割り当て関数と解放関数には、単一の全順序が存在する。

目次

パラメータ

alignment - アラインメントを指定します。実装でサポートされている有効なアラインメントでなければなりません。
size - 割り当てるバイト数。 alignment の整数倍でなければなりません。

戻り値

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

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

注記

size alignment の整数倍ではない場合、または alignment が無効であるか実装でサポートされていない場合、関数は失敗しヌルポインタを返します(C11の当初の仕様ではこの場合の動作は未定義でしたが、 DR460 によって修正されました)。制限的なアライメント境界で小さなオブジェクトを割り当て可能にするためのサイズ制限の撤廃( alignas と同様)が N2072 で提案されています。

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

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

通常の malloc は、基本アラインメントを持つあらゆるオブジェクト型に適したメモリ配置を行います。 aligned_alloc は、 SSE やキャッシュライン、 VMページ 境界など、オーバーアラインメントが必要なメモリ割り当てに有用です。

この関数はMicrosoft Cランタイムライブラリではサポートされていません。その理由は、 std::free の実装が あらゆる種類のアライメントされた割り当てを処理できない ためです。代わりに、MS CRTは _aligned_malloc _aligned_free で解放する必要があります)を提供しています。

#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

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 7.22.3.1 aligned_alloc関数 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 7.22.3.1 aligned_alloc関数 (p: 253)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.22.3.1 aligned_alloc関数 (p: 347-348)

関連項目

C++ ドキュメント for aligned_alloc