STLで自作アロケータ

STLのvectorやmapを使用する機会が増えてきたので、自作のアロケータを作りメモリ使用量などを監視できるようにします。また将来、独自のメモリ管理に置き換えられるようにしておく。


STLのアロケータ

メモリ確保を行うためのクラス(アロケータ)をテンプレートの引数に指定しますが、通常は引数を省略するためデフォルトのアロケータになります。このアロケータを自作、指定することで独自のメモリ管理を行えます。

自作アロケータの定義

VisualStudio2012(Update2)のデフォルトアロケータを参考に自作アロケータを定義。STLコンテナが要求するメンバ関数、型定義、演算子などを定義することでSTL用のアロケータとして利用できます。異なる型同士のやり取りを定義する「struct rebind」や==演算子に注意が必要です。今回は、どの型でも同じメモリ管理関数を使用しているため簡単な定義のみで済んでいます。
一部のVS2012依存部分を変更すれば、他の環境でも使えるはずです(std::_Xbad_alloc()、_NOEXCEPT、_THROW0など)。

自作アロケータの使用例


メモリ使用量を監視するためのメモリ確保解放関数の例


アロケータの比較演算子operator==について

アロケータが同じものかどうか⇒片方のアロケータで確保したメモリをもう片方のアロケータで解放できるかどうか
という解釈で作成しています。STLの仕様に完全に対応しているかどうかわかりません。とりあえず問題なく動作しているだけかもしれないので、利用の際はご注意ください。
vectorやstringのソースコードを見てみると、コピーやムーブする際にアロケータを入れ替えるかどうかの判定で使っているようです。ムーブ時にアロケータが異なる場合、コピーと同じ動作になるため効率への影響が大きくなります。

広告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.