STLのallocatorメモ

『Effective STL』を買いました。

STLはよく使っているものの、効果的な使い方をしていないのではないかと新しい会社に入社して気づきました。

今更って言うな。

で、読みながらちょっとプログラム。

STLのコンテナはallocatorを使って独自のメモリ確保が可能ですが、よく解説で見られるallocatorサンプルではVisualStudioでエラーが出ることがあります。

vectorだと出ないけど、listだと出る。これは rebind<U>::other を使用しているからです。

内部ではallocatorのコピーコンストラクタが発行されるのですが、この時、

allocator<T>( const allocator<U>& )

というコピーコンストラクタ(正確にはコピーじゃないが)が必要になるためのようです。

なので、この定義を作成してやる必要があるのですが、基本的には何もしなくても問題ないようです。

エラーメッセージとして allocator<T>( const allocator<T>& )が?と言われますが、実際には上記のような意味です。テンプレートはエラーメッセージがわかりにくい。

また、rebind<U>::other は通常 allocator<T> のT型以外のメモリ確保が必要になった時に使用されるのですが、普通は allocator<T> と同じアロケータを使用します。

もし、T型とU型は別のアロケート処理をしたい場合、rebind<U>::other を別のアロケータにしてみたらどうなるか?

エラーを回避してやってみた結果、list では実際にメモリ確保されるのはListNodeなので rebind<U>::other が動きました。

では vector なら allocator<T> が動くのか、と思ったら rebind<U>::other が動きました。ホワイ?

まあ、あまりそういう機会はないと思いますが、使いたいと思っても使わない方がいいかも。

使うなら、テンプレートの特殊化を使った方がいいかもしれませんが、どうやったら特殊化できるのか不明。

いろいろ試してみたけどエラーを無くせなかったです。

テンプレートって難しいよね。