7

C++ 文字列についてもう少し学習しようとしています。

検討

const char* cstring = "hello";
std::string string(cstring);

std::string string("hello");

アプリケーションの .data セクションに「hello」を保存し、std::string によって管理されるポインターがアクセスできるヒープ上の別の領域にバイトがコピーされると仮定して正しいでしょうか?

本当に長い文字列を効率的に保存するにはどうすればよいですか? ソケットストリームからデータを読み込むアプリケーションについて考えています。何度も連結するのが怖いです。リンクされたリストを使用して、このリストをトラバースすることを想像できます。

ストリングスは、あまりにも長い間私を怖がらせてきました!

リンク、ヒント、説明、詳細は非常に役立ちます。

4

4 に答える 4

3

数十から数百 MB の範囲の文字列を問題なく保存しました。当然、主に使用可能な(連続した)メモリ/アドレス空間によって制限されます。

追加/連結を行う場合、効率的に役立ついくつかのことがあります: 可能であれば、reserve() メンバー関数を使用してスペースを事前に割り当ててみてください。最終的なサイズが大きくなる可能性がありますが、文字列が大きくなるにつれて不要な再割り当てを回避できます。

さらに、多くの文字列実装は「指数関数的増加」を使用します。つまり、固定バイト サイズではなく、一定の割合で増加します。たとえば、追加のスペースが必要な場合はいつでも、単純に容量を 2 倍にすることができます。サイズを指数関数的に大きくすることで、多くの連結をより効率的に実行できます。(正確な詳細は stl のバージョンによって異なります。)

最後に、別のオプション (ライブラリがサポートしている場合) は、rope<>テンプレートを使用することです。ロープは文字列に似ていますが、非常に大きな文字列に対して操作を実行する場合にはるかに効率的です。特に、「ロープは小さなチャンクで割り当てられるため、大きなブロックによって引き起こされるメモリの断片化の問題が大幅に軽減されます」。SGI の STL ガイドに関する追加の詳細。

于 2011-04-23T22:06:49.293 に答える
2

ソケットから文字列を読み取っているので、同じパケット バッファを再利用し、それらをチェーンして巨大な文字列を表すことができます。これにより、不要なコピーが回避され、おそらく最も効率的な解決策となります。ACEライブラリがそのようなメカニズムを提供していることを覚えているようです。探してみます。

編集: ACE には ACE_Message_Block があり、リンクされたリスト形式で大きなメッセージを保存できます。この巨大なライブラリを理解するには、ほとんど C++ ネットワーク プログラミングの本を読む必要があります。ACE の Web サイトにある無料のチュートリアルは本当に最低です。

Boost.Asioは、ACE のメッセージ ブロックと同じことを実行できるはずですBoost.Asio は現在、ACE よりも大きなマインドシェアを持っているようです。そのため、まず Boost.Asio 内で解決策を探すことをお勧めします。Boost.Asio ソリューションについて誰かが教えてくれれば、それは素晴らしいことです!


Boost.Asio を使用して単純なクライアント サーバー アプリを作成して、大騒ぎが何であるかを確認するときが来ました。

于 2011-04-24T00:49:02.087 に答える
1

効率は問題にすべきではないと思います。どちらも十分に機能します。

ここでの決定要因はカプセル化です。 std::stringこれまでよりもはるかに優れた抽象化ですchar *。ポインター演算をカプセル化することは良いことです。

多くの人がstd::string. 根拠のない効率的な理由でそれを使用しないのはばかげていると思います。より良い抽象化とカプセル化に固執します。

于 2011-04-23T22:07:14.547 に答える
0

おそらくご存じのとおり、anstd::stringは実際には の別の名前ですbasic_string<char>

つまり、これらはシーケンス コンテナーであり、メモリは順次割り当てられます。割り当てることができる使用可能な連続メモリよりも大きくしようとすると、 std::string から例外が発生する可能性があります。通常、このしきい値は、メモリの断片化により、使用可能なメモリの合計よりもかなり小さくなります。

たとえば、画像に大きな連続した 3D バッファを割り当てようとすると、連続したメモリを割り当てる際に問題が発生するのを見てきました。しかし、少なくとも私の経験では、Windows XP Pro (たとえば) では、これらの問題は少なくとも 100MB 程度のオーダーでは発生し始めません。

弦ってこんなに太いの?

于 2011-04-23T22:17:08.907 に答える