11

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

4

2 に答える 2

15

STL コンテナーのステートフル アロケーターの機能は、既に広くサポートされているようです。ほとんどの場合、アロケータがステートフルであっても問題は発生しません。まだ広くサポートされていないのは、問題のある状況 (コンテナーのスワップ (アロケーターもスワップするかどうか)、リストのスプライス) を処理する新しい標準の方法です。

このスレッドは次のように述べています。

現在のほとんどの標準ライブラリ (MS で使用されている Dinkumware を含む) のコードでは、ステートフル アロケータがサポートされています。

このトレッド(libstdc++、2004) は次のように述べています (私が正しく理解していれば):

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

このブログ エントリ(libstdc++、2009 年) には次のように書かれています。

C++0x モードの既存のコンテナーは、ステートフル アロケーターと共に使用するとより効率的になりました (つまり、要素の構築時にその場でアロケーターが作成されません)。

このドキュメントでは、新しいlibc++ ライブラリについて説明しています。

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

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

このスレッドには、この機能の移植性に関する興味深い論争が含まれています。

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

更新: VS2008 の STL では、アロケーターにテンプレート化されたコピー コンストラクターが必要です。これにより、IMO はカスタム アロケーターの最も重要な使用を不可能にします: 単純な分離ストレージです。

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

于 2011-08-01T11:01:32.423 に答える
3

g++はスコープ指定されたアロケーターをまだサポートしていません。

VS2010 は特定の非標準アロケータをサポートしていますが、明らかに標準のものはサポートしていません

于 2011-07-28T14:58:13.447 に答える