Namespaces
Variants

std:: aligned_alloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
ヘッダーで定義 <cstdlib>
void * aligned_alloc ( std:: size_t alignment, std:: size_t size ) ;
(C++17以降)

alignment で指定されたアライメントを持つ未初期化ストレージを size バイト割り当てます( 暗黙的にオブジェクトを生成 します)。 size パラメータは alignment の整数倍でなければなりません。

以下の関数はスレッドセーフであることが要求されます:

特定の記憶単位を割り当てまたは解放するこれらの関数への呼び出しは、単一の全順序で発生し、各解放呼び出しは 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