2011-07-28 3 views
11

新しいC++ 11標準では、コンテナ内のステートフルなアロケータをサポートするためにSTL実装が必要です。メインのSTL実装(Visual Studio 2008、2010、libstdC++)は今この要件に準拠していますか? MSDNまたはlibstdC++のドキュメントでこれについて何も見つかりませんでした。STLコンテナのステートフルアロケータのコンパイラサポート

+0

これらの回答の1つを受け入れますか? – spraff

答えて

14

が広く、既にサポートされているSTLコンテナでのステートフルアロケータの機能のように見える特定の非標準のアロケータをsupportes。ほとんどの場合、アロケータのステートフルな状態は問題を引き起こしません。広くサポートされていないのは、問題の状況を処理する新しい標準の方法(コンテナのスワップ(アロケータも入れ替えるかどうか)、リストのスプライス)です。

This threadは言う:

、ステートフルアロケータはサポートされてい

This tread(のlibstdC++、2004)(DinkumwareのようにMSによって使用を含む)、最新の標準ライブラリのコードで

は言う(私は理解している場合正しく):

既に、l1.get_allocator() != l2.get_allocator()のアロケータをサポートしています。私たちがしないことは、アロケータを検出する特別な規定をsplice()swap()にすることです。

This blog entry(のlibstdC++、2009)は言う:C++ 0xのモードで

既存のコンテナは、ステートフルアロケータ(すなわちとともに今より効率的であり、何のアロケータは、素子構築時にその場で作成されていません)。

This document新しいlibc++ libraryについてこう述べています。

すべてのコンテナは完全にステートフルなアロケータをサポートする最新のアロケータ要件 のすべてを満たしています。 - ステートレスアロケータのためのスペースが最適化されました。

EASTLはステートフルアロケータをサポートします。

This threadには、この機能の移植性に関する興味深い紛争が含まれています。

ほとんどのSTL実装はステートフルなアロケータをサポートしています。つまり、それらはアロケータタイプの追加インスタンスを作成せず、クライアント提供のアロケータインスタンスを格納し、すべてのアロケータ/アロケートはそれを介して行われます。しかし、彼らがswap pingとlist::spliceを処理する方法は、文書化されておらず、移植性がありません。

更新:VS2008のSTLでは、アロケータにカスタムコピーアロケータの最も重要な使用を不可能にするテンプレートコピーコンストラクタが必要です。

STLのステートフルアロケータの現在の状態に満足していない人は、Boost.IntrusiveBoost.Containerと考えることをお勧めします。

+0

実際に_all_標準ライブラリでは、アロケータはテンプレート化されたコピーコンストラクタと 'rebind'テンプレートを持ち、それらを使用する必要があります。これは、 'vector'と' deque'を除くすべてのコンテナが、実装定義の構造体の一部を要素に割り当てているので、指定されたアロケータからその構造体のためのアロケータを作成する必要があるからです。これは、アロケータ作成者が単に考慮する必要があることの1つです。 –

関連する問題