void* do_allocate(std::size_t bytes, std::size_t alignment) override;
概要
要求されたサイズおよびアライメントでメモリを割り当てる。
割り当てられた領域のサイズと配置・要件等はmemory_resource::do_allocate()に従う。
事前条件
alignmentは2の累乗であること
引数
bytes-- 割り当てるメモリのサイズalignment-- 割り当てる領域へのアライメント要求
効果
内部メモリ領域から指定されたbytesとalignmentでメモリを割り当てることができる場合は(内部メモリにそのような空き領域がある場合は)内部メモリ領域から割り当てを行う。
それができない場合、上流メモリリソースから内部メモリ領域を補充し割り当てを行う。
内部メモリ領域を補充する場合、this->upstream_resource()->allocate(n, m)のように上流メモリリソースから追加のメモリを取得する。
次に補充する予定のメモリ領域サイズをnext_buffer_sizeという変数に保持しているとするとn, mはn = max(bytes, next_buffer_size)、m >= alignmentとなる値をそれぞれ用いる。
その後、next_buffer_sizeを実装定義の増加分(整数とは限らない)だけ増やす。
少なくともbytesのメモリを割り当て、alignmentにアラインする。
戻り値
割り当てた領域の先頭へのポインタ
例外
this->upstream_resource()->allocate()が例外を投げないのならば、この関数も例外を投げない。
バージョン
言語
- C++17
処理系
- Clang: ??
- GCC: 9.1 ✅
- Visual C++: 2017 update 6 ✅