std::aligned_alloc
| ヘッダ <cstdlib> で定義 |
||
| void* aligned_alloc( std::size_t alignment, std::size_t size ); |
(C++17以降) | |
アライメントがalignmentで指定された、初期化されていないsizeバイトのストレージを割り当てる(宛先領域にオブジェクトを暗黙的に作成する)。sizeパラメータはalignmentの整数倍でなければならない。
以下の関数はスレッドセーフである必要がある
- operator newとoperator deleteのライブラリバージョン
- グローバルなoperator newとoperator deleteのユーザー置換バージョン
- std::calloc, std::malloc, std::realloc, std::aligned_alloc, std::free
これらの関数に対する、特定のストレージ単位を割り当てるまたは解放する呼び出しは、単一の総順序で発生し、そのような各解放呼び出しは、この順序での次の割り当て(もしあれば)よりhappens-beforeである。
目次 |
[編集] パラメータ
| alignment | - | アライメントを指定する。実装がサポートする有効なアライメントでなければならない。 |
| size | - | 割り当てるバイト数。alignmentの整数倍。 |
[編集] 戻り値
成功した場合、新しく割り当てられたメモリの先頭へのポインタを返す。メモリリークを避けるために、返されたポインタはstd::freeまたはstd::reallocで解放されなければならない。
失敗した場合、ヌルポインタを返す。
[編集] 備考
sizeがalignmentの整数倍でないか、alignmentが実装で有効またはサポートされていない場合、関数は失敗しヌルポインタを返す(発行されたC11ではこの場合、未定義動作と指定されていたが、DR460によって修正された)。
「実装によってサポートされる」要件の例として、POSIX関数posix_memalignは、2のべき乗であり、かつsizeof(void*)の倍数である任意のアライメントを受け入れ、aligned_allocのPOSIXベースの実装は、この要件を継承する。
基本アライメントは常にサポートされる。alignmentが2のべき乗であり、かつalignof(std::max_align_t)以下である場合、aligned_allocは単にstd::mallocを呼び出す可能性がある。
通常のstd::mallocは、基本アライメントを持つ任意のオブジェクト型に適したメモリをアラインする。この関数は、SSE、キャッシュライン、またはVMページ境界などの、オーバーアラインされた割り当てに役立つ。
この関数はMicrosoft C Runtimeライブラリではサポートされていない。std::freeの実装が、いかなる種類のアラインされた割り当てをも処理できないためである。代わりに、MS CRTは_aligned_malloc(_aligned_freeで解放される)を提供する。
[編集] 例
#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以降)(C++23で非推奨) |
与えられたサイズの型の未初期化ストレージとして使用するのに適した型を定義する (クラステンプレート) |
| aligned_allocのC言語ドキュメント
| |