でカスタムSTLアロケータで、私は、カスタムアロケータを構築するつもりだいくつかのクラスT
のN
要素を格納するための大きなブロック(配列)を事前割り当て、その後、ちょうど内側率を高めますアレイからサービスへの割り当て要求。再結合が事前に割り当てられたブロック
私が事前に割り当てられたブロック内の要素の任意の初期化を望んでいんので、このような何かが動作しません。
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が((base+N)
まで)要求され、Tは、必要に応じて(配置)の場所にを構築することができる。
このスキームを使用して、STLコンテナのカスタムアロケータを定義します。しかし、rebindingの場合はここに問題があるようです。実際、私の理解が正しいならば、STLアロケータはタイプT
からタイプU
へのリバインドをサポートすべきです。 std::list<T>
(std::map
状または他のノードベースのコンテナ)のようなコンテナは、実際にタイプT
のないノードを割り当てるアロケータを使用するが、異なるタイプU
の(T
およびノードの他の「ヘッダ」オーバーヘッド情報を含む)からです。 上記のstd::aligned_storage
アプローチはリバインドでうまくいくでしょうか?または、(私が思う)T
の正しい位置合わせはではありません。は、別の異なるタイプの正しい位置合わせを暗示します。U
?
この問題を解決するにはどうすればよいですか?
前述のbuffer
を定義して、別の種類のリバウンドにも対応できるようにするにはどうすればよいですか?U
?
この問題は別の観点から攻撃されるべきですか?もしそうなら、何?
代わりに、 'std :: alignment_of :: value'を代わりに使って、C++標準アロケータでサポートされている型に対して正しく整列させることはできませんか?もちろん、特別な(より厳密な)アラインメント要件(最良の例SSE)を持つ型では機能しませんが、標準アロケータであっても、これらは常に問題になります。 –