2011-03-09 5 views
7

私がいつも考えていたことの1つは、私がC++コードで使用しているstd::stringのインスタンスが同じアロケータを使用しているのか、それとも彼ら自身の別々のメモリプールを持っているのでしょうか?C++ std :: stringの個々のインスタンスは同じアロケータを使用しますか?

明らかに、複数の頻繁に作成され破棄された文字列全体で1つのメモリプールを共有するほうが効率的です。誰でも私のためにこれを確認するか否定することができますか?

答えて

10

デフォルトでは、すべて標準メモリルーチンを使用してフリーヒープブロックを取得するstd::allocatorを使用します。この層にはプールがありません。

(ただし、ほとんどのヒープ実装では、小さな割り当てを処理するために専用の低フラグメンテーションヒープを使用しますが、文字列はこのカテゴリに分類される可能性が最も高いですが、これは実装依存であり、std::string ... )。

+0

おかげで、それは私が知りたかったものの線に沿っています。 –

2

異なるインスタンスのC++では、指定しない場合は同じアロケータが使用されます。あなたは、おそらくjava/pythonなどの標準である文字列インターンを参照しています。もしそうなら、いいえ。そのための標準的な施設はありません。しかし、頻繁に破壊する/作成した場合に追加するのは簡単である問題

http://en.wikipedia.org/wiki/String_interning

+0

同じアロケータの異なるインスタンスですが、C++ 03では、与えられたアロケータ型のすべてのインスタンスは同等です。つまり、別のインスタンスによって割り当てられたメモリを解放できなければなりません。これは、通常、実際には同じ場所から割り当ておよび割り当てを解除することを意味します。この変更はC++ 0xです。 –

関連する問題