2012-03-18 6 views
3

カスタムアロケータ、特にallocate/deallocateメソッドをカスタマイズする機能は非常に便利です。特定のパフォーマンスに重要な領域で使用される低レベルのメモリ割り当て方法を制御できます。ノードベースのコンテナの場合はPooled allocators、およびfixed-size allocatorsが考えられます。アロケータでカスタムの構築/破壊メソッドを使用すると便利なのはいつですか?

しかし、カスタムconstruct/destroyメソッドを定義すると便利なのはいつですか?

私は、これらの方法は配置newと明示的な破壊と同じ効果を持っていることを、標準的な任務、すなわちそれを理解したよう:

//construct should give the same effect as: 
    construct (_Type *_ptr, _Type const&_val) 
    { 
     new(_ptr) _Type(_val); 
    } 
//destroy should give the same effect as: 
    destroy (_Type *_ptr) 
    { 
     _ptr->~_Type(); 
    } 

を別の方法でこれらのメソッドを実装する方法はあり - 配置を使用していませんnewと明示的な破壊?そうでない場合、なぜそれらがアロケータオブジェクトの一部ですか?誰もがちょうど配置newと明示的な破壊を直接使用した方が簡単だろうか?

+2

'construct'関数は、おそらく* placement newの他に*何かを行う可能性があります。これはカスタマイズポイントであり、必要な場合は持っておくと良いです。 –

+0

@BoPersson:「何か他のもの」とは何かの実用的な例はありますか?私は、実際のオブジェクトタイプ自体の 'ctor/dtor'にはうまくいかないものは考えていません...また、' construct/destroy'が単純なオブジェクトの作成/破壊とは異なる何かをした場合、スタック上に作成されたローカルオブジェクトの動作は、アロケータを使用して作成された動作とは異なります。それは妥当ですか? –

+0

これがアロケータでこの機能を持つ理由の1つです。おそらく、コンテナが共有メモリに格納されているときに特別なものが必要でしょうか?それは*含まれているオブジェクトがスタックオブジェクトと異なることを許可します。 –

答えて

0

テンプレート引数の周りにラッパー型を置き換え、その代わりにconstructdestroyが割り当てられた型ではなくラッパーコンストラクターとデストラクタを呼び出す必要があります。

C++ 11では、constructは任意の数の引数をコンストラクタに転送します。カスタムアロケータは、リストの先頭または最後に引数を挿入したり、引数を傍受したり変更したりすることができます。これは、ユーザーがインプレース構造を使用している場合にのみ機能します。

ところで、_Typeを識別子として使用しないでください。アンダースコアの先頭に資本が続く識別子は、実装のために予約されています。

関連する問題