カスタムアロケータ、特に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
と明示的な破壊を直接使用した方が簡単だろうか?
'construct'関数は、おそらく* placement newの他に*何かを行う可能性があります。これはカスタマイズポイントであり、必要な場合は持っておくと良いです。 –
@BoPersson:「何か他のもの」とは何かの実用的な例はありますか?私は、実際のオブジェクトタイプ自体の 'ctor/dtor'にはうまくいかないものは考えていません...また、' construct/destroy'が単純なオブジェクトの作成/破壊とは異なる何かをした場合、スタック上に作成されたローカルオブジェクトの動作は、アロケータを使用して作成された動作とは異なります。それは妥当ですか? –
これがアロケータでこの機能を持つ理由の1つです。おそらく、コンテナが共有メモリに格納されているときに特別なものが必要でしょうか?それは*含まれているオブジェクトがスタックオブジェクトと異なることを許可します。 –