アロケーターは多種多様な状況に臨機応変に対応するために、複数の戦略・方針を実装しておき、必要に応じて柔軟に切り替えるのが一般的ですかね。
まあ意味分からないでしょうから、説明しますね。
アロケーター内で割り当ての戦略・方針を複数まず作ります。
具体案としては
あたりでしょうかね。
例としては 64 バイト以下でも全て 64 バイトブロックで割り当てるのが 64 バイト均等ブロックで割り当てるロジックや、65 バイトから 256 バイトまでの割り当てリクエストを 256 バイト均等ブロックで割り当てるロジックが混在しているアロケーターです。
複数のアラインメントサイズのメモリープールを、最適化であったり、ハード仕様に合わせるために作っておくのも便利です。
もしくはアロケーター内のロジック実装ではなく、アロケーター自体のインスタンスを切り替えるという手法もありますね。
てなことで、さらに以下のように分類できます。
先に断っておくと、名称は全て筆者が独断と偏見に基づいて命名したので、この本の外では一切通じないと思います。
内部セレクトまたは内部セレクターの実装は、クラス内の条件文で記述を加える程度なので一番楽ですが、アロケータークラスに全てを記述するためにクラスが大きくなるため、メンテナンスが煩雑になりがちです。
スタティックセレクトは、異なるパラメーターを持つスタティックインスタンスを作って切り替える手法です。
インスタンスの管理はマネージャークラスで行わないとできないので、コードはシンプルになる傾向があります。
ポリモーフィズムについては C++17 で polymorphic_allocator が導入されているので、そちらで解説したいと思います。
Copyright 2018-2019, by Masaki Komatsu