文字列操作を操作する必要がある場合、std::stringとstd::stringbufの間にパフォーマンスに大きな違いはありますか?ある場合はその理由。
より一般的には、std::stringよりもstd::stringbufを使用するのが適切な場合は?
Astd::stringbuf
は内部で文字列を使用してデータをバッファリングするため、おそらく少し遅くなります。基本的には単なる委任であるため、違いは重要ではないと思います。ただし、パフォーマンステストを実行する必要があることを確認してください。
std::stringbuf
IOストリームで文字列をバッファとして使用する場合に便利です(たとえば、デフォルトstd::stringstream
でを使用std::stringbuf
します)。
まず第一に、astd::stringbuf
は必ずしも(または通常でも)内部ストレージにを使用するわけではありません。std::string
たとえば、この標準では、からの初期化についてstd::string
次のように説明しています。
クラスbasic_stringbufのオブジェクトを構築します...次に、strの内容をbasic_stringbufの基礎となる文字シーケンスにコピーします[...]
「文字シーケンス」という表現に注意してください。少なくとも私にとっては、コンテンツを実際の文字列に格納する必要があると言わないように(または暗示するように)、これは非常に注意深いようです。
それを過ぎると、効率はおそらく赤ニシンだと思います。どちらも、ある種の文字のようなシーケンスの動的に割り当てられたバッファを管理するためのかなり薄いラッパーです。機能には大きな違いがあります(たとえば、string
文字列の途中に多くの検索と挿入/削除があり、それらは完全に存在しませんstringbuf
)。stringbuf
その目的を考えると、のようなものの上に実装して、最後に挿入/削除の(通常の)パスを最適化することは理にかなっているかもしれませんがstd::deque
、これはほとんどの用途にとって実質的ではない可能性があります。
もし私がそれをやっていたとしたら、stringbuf
おそらく一緒にしかテストされていないという事実に最も心配するでしょうstringstream
、それで私がそれを使ったのとは違ったやり方でそれを使ったならstringstream
、私が標準がそうあるべきであると言っていても私は問題に遭遇するかもしれません。サポート。
std::stringbuf
std::string
への読み取りと書き込みのために、コンテナを拡張しstd::string
ます。
std::string
一般に、との間に大きなパフォーマンスの違いはありませんstd::stringbuf
。
std::streambuf
<- std::stringbuf
、両方の理由:
typedef basic_stringbuf<char> stringbuf;
typedef basic_string<char> string;
詳細については、こちらをお読みください。