カスタム allocatorを作成してN
、いくつかの class の要素を格納するための大きなブロック (配列) を事前に割り当ててT
から、配列内のインデックスを増やして、割り当て要求を処理します。
事前に割り当てられたブロック内の要素の初期化が必要ないため、次のようなものは機能しません。
T buffer[N];
この場合、のコンストラクターがブロックの要素T
に対して呼び出されるためです。N
私の理解では、のコンストラクターstd::aligned_storage
は呼び出されないため、次のようなものを使用することを考えました。T
std::aligned_storage
std::aligned_storage<
N * sizeof(T),
std::alignment_of<T>::value
>::type buffer;
T* base = static_cast<T*>( static_cast<void*>(&buffer) );
そして、アロケータは、T の割り当てが要求されたときにベース ポインタをインクリメントするだけで (まで)、T は必要に応じて (placement を使用して) その場(base+N)
で構築できます。new
このスキームを使用して、STL コンテナーのカスタム アロケーターを定義したいと思います。ただし、ここで再バインドの問題が発生する可能性があるようです。実際、私の理解が正しければ、STL アロケータは type から type への再バインドをサポートする必要T
があります。タイプ(ノードのその他の「ヘッダー」オーバーヘッド情報を含む)。では、前述のアプローチは再バインドにうまく機能しますか? または(私が思うに) s の正しい配置はそうではありませんU
std::list<T>
std::map
T
U
T
std::aligned_storage
T
別の異なるタイプの正しい配置を意味しますU
か?
この問題はどのように解決できますか?
buffer
前述を定義して、別のタイプへの再バインドにも機能させるにはどうすればよいU
ですか?
この問題は別の視点から取り組むべきでしょうか? もしそうなら、何?