Namespaces
Variants

std::allocator<T>:: allocate_at_least

From cppreference.net
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)
constexpr std:: allocation_result < T * , std:: size_t >
allocate_at_least ( std:: size_t n ) ;
(C++23以降)

count * sizeof ( T ) バイトの未初期化ストレージを割り当てます。ここで count n 以上となる未指定の整数値であり、 :: operator new を呼び出すことで実現されます(場合によっては追加の std::align_val_t 引数が付加される可能性があります)。ただし、この関数がいつどのように呼び出されるかは未指定です。

次に、この関数はストレージ内に型 T [ count ] の配列を作成し、その生存期間を開始しますが、その要素のいずれの生存期間も開始しません。

この関数を定数式で使用するには、割り当てられたストレージが同じ式の評価内で解放されなければなりません。

この関数の使用は、 T 不完全型 である場合、不適格となります。

目次

パラメータ

n - ストレージを割り当てるオブジェクト数の下限

戻り値

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

例外

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

注記

allocate_at_least は主に連続コンテナ、例えば std::vector および std::basic_string のために提供されており、可能な場合に実際に割り当てられたサイズに容量を合わせることで再割り当てを減らすことを目的としています。

「いつどのように行われるかは未規定」という文言により、標準ライブラリのコンテナが行う ヒープ確保の結合や最適化 が可能となります。これは :: operator new の直接呼び出しでは認められていない最適化です。例えば、これはlibc++で実装されています( [1] および [2] )。

allocate_at_least を呼び出した後、要素の構築前に、 T * のポインタ演算は割り当てられた配列内で well-defined ですが、要素にアクセスした場合の動作は未定義です。

機能テスト マクロ 標準 機能
__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メンバ関数)