std::aligned_alloc
ヘッダ <cstdlib> で定義
|
||
void* aligned_alloc( std::size_t alignment, std::size_t size ); |
(C++17以上) | |
alignment
で指定されたアライメントを持つ size
バイトの未初期化記憶域を確保します。 size
引数は alignment
の整数倍でなければなりません。
以下の関数はスレッドセーフであることが要求されます。
記憶域の特定の単位を確保または解放するこれらの関数の呼び出しは単一の全順序で発生し、そのような解放の呼び出しそれぞれはこの順序における次の確保 (もしあれば) に対して先行発生します。 |
(C++11以上) |
目次 |
[編集] 引数
alignment | - | アライメントを指定します。 処理系がサポートしている有効なアライメントでなければなりません |
size | - | 確保するバイト数。 alignment の整数倍でなければなりません
|
[編集] 戻り値
成功した場合は、新たに確保されたメモリの先頭を指すポインタを返します。 メモリリークを避けるためには、返されたポインタは std::free() または std::realloc() で解放しなければなりません。
失敗した場合は、ヌルポインタを返します。
[編集] ノート
alignment
の整数倍でない size
を渡したり、有効でないまたは処理系がサポートしていない alignment
を渡したりすると、関数は失敗し、ヌルポインタを返します (このケースは C11 の発行時点では未定義動作と規定されていましたが、 DR 460 で訂正されました)。 小さなオブジェクトをより厳しいアライメント境界で割り当てる (alignas と同様に) ことができるようサイズの制約を除去することが n2072 で提案されています。
「処理系がサポートしている」の例として、 POSIX の関数 posix_memalign は2の乗数かつ sizeof(void *)
の倍数である任意の alignment
を受理します。 POSIX ベースの処理系の aligned_alloc
はこの要求を引き継いでいます。
通常の std::malloc はあらゆるオブジェクト型に適したメモリアライメントを行います (これは実質的には alignof(std::max_align_t) にアラインすることを意味しています)。 この関数は SSE やキャッシュライン、あるいは仮想メモリのページ境界などに対するオーバーアラインされた確保のために役に立ちます。
[編集] 例
#include <cstdio> #include <cstdlib> int main() { int* p1 = static_cast<int*>(std::malloc(10*sizeof *p1)); std::printf("default-aligned address: %p\n", static_cast<void*>(p1)); std::free(p1); int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024)); std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2)); std::free(p2); }
出力例:
default-aligned address: 0x2221c20 1024-byte aligned address: 0x2222400
[編集] 関連項目
(C++11) |
指定されたサイズの未初期化記憶域として使用するのに適した型を定義します (クラステンプレート) |
aligned_alloc の C言語リファレンス
|