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のべき乗でありかつ
alignment
が
sizeof
(
void
*
)
の倍数である任意の値を受理し、POSIXベースの
aligned_alloc
実装はこの要件を継承する。
基本的なアライメントは常にサポートされます。
alignment
が2の累乗であり、かつ
alignof
(
std::
max_align_t
)
以下である場合、
aligned_alloc
は単に
std::malloc
を呼び出す可能性があります。
通常の std::malloc は、基本アラインメントを持つ任意のオブジェクト型に適したメモリをアラインメントします。この関数は、 SSE やキャッシュライン、 VMページ 境界など、オーバーアラインメント割り当てに有用です。
この関数はMicrosoft Cランタイムライブラリではサポートされていません。なぜなら、その
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で非推奨)
|
指定されたサイズの型を未初期化ストレージとして使用するための型を定義する
(クラステンプレート) |
|
Cドキュメント
for
aligned_alloc
|
|