std::allocator<T>::allocate
| (1) | ||
| pointer allocate( size_type n, const void* hint = 0 ); |
(C++17まで) | |
| T* allocate( std::size_t n, const void* hint ); |
(C++17以降) (非推奨) (C++20で削除) |
|
| (2) | ||
T* allocate( std::size_t n ); |
(C++17以降) (C++20まで) |
|
| constexpr T* allocate( std::size_t n ); |
(C++20以降) | |
未初期化のストレージを n * sizeof(T) バイトだけ確保します。これは ::operator new(std::size_t) を呼び出して行われます。ただし、いつ、どのように呼び出されるかは未規定です。または ::operator new(std::size_t, std::align_val_t)(C++17 以降)。ポインタ hint は参照の局所性を提供するために使用できます。実装がサポートしている場合、アロケータは hint に可能な限り近い場所に新しいメモリブロックを割り当てようとします。
その後、この関数はストレージ内に T[n] 型の配列を作成し、そのライフタイムを開始しますが、要素のライフタイムは開始しません。
T が不完全型である場合、この関数の使用はill-formedです。
|
定数式でこの関数を使用するには、確保されたストレージが同じ式の評価中に解放されている必要があります。 |
(C++20以降) |
目次 |
[編集] Parameters
| n | - | 割り当て対象のオブジェクト数 |
| hint | - | 近くのメモリ位置へのポインタ |
[編集] Return value
要素がまだ構築されていない T 型のオブジェクト n 個の配列の最初の要素へのポインタ。
[編集] Exceptions
|
|
(C++11以降) |
確保に失敗した場合、std::bad_alloc をスローします。
[編集] Notes
「いつ、どのように呼び出されるかは未規定」という記述により、標準ライブラリコンテナによるヒープ割り当てを結合または最適化することが可能になります。これは、直接 ::operator new を呼び出す場合には許可されていない最適化です。例えば、libc++ではこのように実装されています([1] および [2])。
allocate() を呼び出した後、要素の構築前には、割り当てられた配列内での T* のポインタ演算はwell-definedですが、要素にアクセスした場合は未定義の動作となります。
[編集] Defect reports
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 578 | C++98 | hint は 0 またはallocate() によって以前返され、まだ deallocate() に渡されていないポインタである必要がありました。 |
要求されない |
| LWG 3190 | C++11 | allocate() が間違ったサイズのストレージを確保する可能性がありました。 |
代わりに std::bad_array_new_length をスローします。 |
[編集] See also
| [static] |
アロケータを使用して未初期化のストレージを割り当てる ( std::allocator_traits<Alloc> の public static メンバー関数) |