2009-07-12 4 views
10

私のアプリケーションには、多くの文字列をコピーしたり、ハッシュテーブルなどのキーと同じ文字列を使用するなど、これを非常に効率的にする私の弦の基本クラスを探しています。メモリ効率のよいC++文字列(インターン、ロープ、コピーオンライトなど)

私は願っています:コピー・オン・ライト(私はこれはほぼすべてのstdに無料で来ると思うインターン

  • 文字列(同じ値の複数の文字列が同じメモリを使用)、
  • ::文字列の実装)、
  • ロープのあるものはボーナス(O(1) - 連鎖の場合)です。

私のプラットフォームはLinuxではg ++ですが、それは問題ではありません。

このようなライブラリについて知っていますか?

答えて

5

ほとんどの文字列が不変の場合、Boost Flyweightライブラリがニーズに合っている可能性があります。

文字列インターンを実行しますが、コピーオンライトとは思われません。

+0

std :: stringをラップするために使用すると、コピーオンライトに影響を与えないようです。 –

9

は、コピー・オン・ライト

は、私は、これはもはやケースです信じていません(私はこれは、ほぼすべてのstd ::文字列の実装では、無料で来ると思います)。 Copy-On-Writeは、イテレータを使用して文字列を変更すると問題を引き起こします。特に、これは不要な結果を招きます(つまり、コピーがなく、両方の文字列が変更される)か、または不要なオーバーヘッドです(ポインタは、参照解除されるときに追加チェックを実行する必要があります)。

さらに、現代のC++コンパイラはすべてNRVOを実行し、ほとんどの場合、戻り値文字列をコピーする必要性を排除します。これはコピーオンライトセマンティクスの最も一般的なケースの1つであるため、前述の欠点のために削除されています。

+4

マルチスレッドの問題は言及しません... –

+2

また、ヒープではなく、データを格納するための小さなバッファを埋め込んだ小さな文字列最適化もあります。驚いたことに、GCCのデフォルトの文字列クラス(libstdC++)は、コピーオンライトです。 –

+1

C++ 11はCOW文字列クラスを禁止します – Ghita

2

は役立つかもしれない伝説のポール謝から

+0

それはかなりいいようですが、それはあまりにもイテレータが欠けています。 –

+2

"Bstrlibは設計上、メモリサイズのオーバーフロー攻撃を受けないように書いてありますが、ライブラリの書き込みは信頼できません。 理由は、bstringの長さが〜 size_t)0。 "彼が銀色の弾丸を見つけたと思うさらに別のアマチュアは、それが現れる方法です。 – MSalters

+0

私が探しているものは提供していないようです... –

5

アンドレイアレキの「Policy Based basic_string implementation」をThe Better String Libraryを見てみましょう。

+0

これはあまり役に立ちませんが、それほど素晴らしいことではありません。 –

+0

私はそれを読んでからしばらくしていますが、私はあなたのポストを見たときに心に湧き出ました。 –

関連する問題