パート VII. (汎用ではない)カスタムアロケーターの設計

目次

85. アロケーターに必要な最低限の関数・オーバーロード・テンプレート
86. std::allocator を使うだけのリファレンスアロケーター
86.1. std::allocator を模したカスタムアロケーター

警告

STLコンテナ全般に適用できる汎用的なアロケーターは難易度が高いため、STLコンテナのアロケーターについては実験的なものとお考えください。

カスタムアロケーターの設計技術は C++ (魔界系黒魔術)の中でも難易度は最高峰です…

なぜ高難易度かはやってみるとわかりますよ…

バグでまくり、リークしまくり… 強固な精神力がないとやってられないですね。

良い子はアロケーターだけは絶対に自作してはならないと筆者は考えますが、読者には C++ のハッカーになる野望をお持ちの方も少なからずいるでしょうから、あえて何も言いません。

まず通常必要なアロケーターで必要な 2 つの要件です。

  1. アロケーターの要件に準拠する
  2. 使いまわすための仕組みとガーベッジコレクター

STLコンテナに使えそうなアロケーターを考える人もいるにはいますが、ヒープ領域のためのアロケーター難しくはないものの単なる配列の延長線上として std::vector 向けのアロケーターだけでなく std::map まで含めた汎用アロケーターとなると凄まじく難易度が上がります。

言うまでもなく汎用ではないので、以下のような点もできて当然ってことです。

  1. スタック領域にメモリーの割り当てをする
  2. 内部バッファーの設計

スタック領域の割当はプレースメント new を使えば良いのですが、実用性を与えるにはメモリープールを実装する必要があります。

ガーベッジコレクターにはスマートポインターを使うのが正攻法なので、その流れでスマートポインターのAPIに準拠したデリーターもついでに作る必要があります。

どれも一筋縄ではいきませんが、一つ一つ課題をクリアしていけば決して難しいものではないです。

では作って行きましょう。

Copyright 2018-2019, by Masaki Komatsu