aligned_alloc
|
ヘッダーで定義
<stdlib.h>
|
||
| (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
で解放する必要があります)を提供しています。
例
出力例:
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
|