カスタム allocatorを作成してN、いくつかの class の要素を格納するための大きなブロック (配列) を事前に割り当ててTから、配列内のインデックスを増やして、割り当て要求を処理します。
事前に割り当てられたブロック内の要素の初期化が必要ないため、次のようなものは機能しません。
T buffer[N];
この場合、のコンストラクターがブロックの要素Tに対して呼び出されるためです。N
私の理解では、のコンストラクターstd::aligned_storageは呼び出されないため、次のようなものを使用することを考えました。Tstd::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 の正しい配置はそうではありませんUstd::list<T>std::mapTUTstd::aligned_storageT別の異なるタイプの正しい配置を意味しますUか?
この問題はどのように解決できますか?
buffer前述を定義して、別のタイプへの再バインドにも機能させるにはどうすればよいUですか?
この問題は別の視点から取り組むべきでしょうか? もしそうなら、何?