std::allocator<T>::allocate_at_least
| 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}。ここで、p は count 個の T 型のオブジェクトの配列の最初の要素を指し、その要素はまだ構築されていない。
[編集] 例外
std::numeric_limits<std::size_t>::max() / sizeof(T) < n の場合、std::bad_array_new_length をスローし、確保に失敗した場合は std::bad_alloc をスローする。
[編集] 注釈
allocate_at_least は主に、可能であれば容量を実際に確保されたサイズに一致させることにより、再割り当てを減らすために、std::vector や std::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
[編集] 関連項目
| (C++23) |
allocate_at_least によって割り当てられたストレージのアドレスと実際のサイズを記録します(クラステンプレート) |
| [static] (C++23) |
アロケーターを介して、要求されたサイズ以上のストレージを割り当てます。 ( std::allocator_traits<Alloc> の public static メンバー関数) |