名前空間
変種
操作

std::allocator<T>::allocate_at_least

From cppreference.com
< cpp‎ | memory‎ | allocator
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
std::allocator
メンバ関数
(C++20まで)
allocator::allocate_at_least
(C++23)
(C++20まで)
(C++20まで)
非メンバ関数
 
constexpr std::allocation_result<T*, std::size_t>
    allocate_at_least( std::size_t n );
(C++23から)

count は、n 以上の未指定の整数値」であるような、count * sizeof(T) バイトの未初期化ストレージを、(おそらく `std::align_val_t` 引数付きの) `::operator new` を呼び出すことで確保する。しかし、この関数がいつ、どのように呼び出されるかは未指定である。

その後、この関数はストレージ内に `T[count]` 型の配列を作成し、その生存期間を開始するが、その要素のいずれかの生存期間は開始しない。

この関数を定数式で使用するには、確保されたストレージは同じ式の評価中に解放されなければならない。

T不完全型である場合、この関数の使用は不正な形式である。

目次

[編集] パラメータ

n - ストレージを確保するオブジェクトの数の下限

[編集] 戻り値

std::allocation_result<T*>{p, count}。ここで、pcount 個の T 型のオブジェクトの配列の最初の要素を指し、その要素はまだ構築されていない。

[編集] 例外

std::numeric_limits<std::size_t>::max() / sizeof(T) < n の場合、std::bad_array_new_length をスローし、確保に失敗した場合は std::bad_alloc をスローする。

[編集] 注釈

allocate_at_least は主に、可能であれば容量を実際に確保されたサイズに一致させることにより、再割り当てを減らすために、std::vectorstd::basic_string のような連続コンテナのために提供されている。

「いつ、どのように呼び出されるかは未指定」という表現により、標準ライブラリコンテナによるヒープ割り当てを 結合したり最適化したりすることが可能になる。たとえそのような最適化が `::operator new` への直接呼び出しでは許可されていなくても。例えば、これは libc++ によって実装されている ([1] および [2])。

allocate_at_least を呼び出した後、要素の構築前に、`T*` のポインタ演算は確保された配列内で適切に定義されるが、要素にアクセスした場合は未定義の動作となる。

機能テストマクロ 規格 機能
__cpp_lib_allocate_at_least 202302L (C++23) allocate_at_least など。

[編集]

#include <memory>
#include <print>
 
int main()
{
    const std::size_t count{69};
    std::allocator<int> alloc;
    std::allocation_result res{alloc.allocate_at_least(count)};
    std::print("count: {}\n"
               "res.ptr: {}\n"
               "res.count: {}\n", count, res.ptr, res.count);
 
    /* construct, use, then destroy elements */
 
    alloc.deallocate(res.ptr, res.count);
}

実行結果の例

count: 69
res.ptr: 0x555a486a0960
res.count: 96

[編集] 関連項目

allocate_at_least によって割り当てられたストレージのアドレスと実際のサイズを記録します
(クラステンプレート) [編集]
[static] (C++23)
アロケーターを介して、要求されたサイズ以上のストレージを割り当てます。
(std::allocator_traits<Alloc> の public static メンバー関数) [編集]
English 日本語 中文(简体) 中文(繁體)