新しい C++11 標準では、STL 実装でコンテナー内のステートフル アロケーターをサポートする必要があります。現在、主要な STL 実装 (Visual Studio 2008、2010、libstdc++) はこの要件に準拠していますか? これについては、MSDN または libstdc++ のドキュメントで何も見つかりませんでした。
2 に答える
STL コンテナーのステートフル アロケーターの機能は、既に広くサポートされているようです。ほとんどの場合、アロケータがステートフルであっても問題は発生しません。まだ広くサポートされていないのは、問題のある状況 (コンテナーのスワップ (アロケーターもスワップするかどうか)、リストのスプライス) を処理する新しい標準の方法です。
このスレッドは次のように述べています。
現在のほとんどの標準ライブラリ (MS で使用されている Dinkumware を含む) のコードでは、ステートフル アロケータがサポートされています。
このトレッド(libstdc++、2004) は次のように述べています (私が正しく理解していれば):
アロケータは既にサポートされています
l1.get_allocator() != l2.get_allocator()
。私たちがしていないのは、splice()
とのアロケータを検出するための特別な準備swap()
です。
このブログ エントリ(libstdc++、2009 年) には次のように書かれています。
C++0x モードの既存のコンテナーは、ステートフル アロケーターと共に使用するとより効率的になりました (つまり、要素の構築時にその場でアロケーターが作成されません)。
このドキュメントでは、新しいlibc++ ライブラリについて説明しています。
すべてのコンテナーは、ステートフル アロケーターを完全にサポートする最新のアロケーター要件をすべて満たしています。– 最適化されたステートレス アロケーターのスペース。
EASTLはステートフル アロケータをサポートしています。
このスレッドには、この機能の移植性に関する興味深い論争が含まれています。
そのため、ほとんどの STL 実装はステートフル アロケーターをサポートしています。つまり、内部でアロケーター タイプの追加インスタンスを作成するのではなく、クライアントが提供するアロケーター インスタンスを格納し、すべての割り当て/割り当て解除はそれを介して行われます。ただし、swap
pingを処理する方法list::splice
は文書化されておらず、移植性がありません。
更新: VS2008 の STL では、アロケーターにテンプレート化されたコピー コンストラクターが必要です。これにより、IMO はカスタム アロケーターの最も重要な使用を不可能にします: 単純な分離ストレージです。
STL のステートフル アロケータの現状に満足していない人には、 と を検討することをお勧めしBoost.Intrusive
ますBoost.Container
。
g++はスコープ指定されたアロケーターをまだサポートしていません。
VS2010 は特定の非標準アロケータをサポートしていますが、明らかに標準のものはサポートしていません