名前空間
変種
操作

std::aligned_alloc

提供: cppreference.com
< cpp‎ | memory‎ | c
 
 
 
動的メモリ管理
未初期化記憶域
(C++17)
ガベージコレクションサポート
その他
(C++20)
(C++11)
(C++11)
C のライブラリ
aligned_alloc
(C++17)
低水準のメモリ管理
 
ヘッダ <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

[編集] 関連項目

指定されたサイズの未初期化記憶域として使用するのに適した型を定義します
(クラステンプレート) [edit]
aligned_allocC言語リファレンス