C ++(MFC)のマルチスレッドデスクトップアプリケーションがあります。現在、開発者は、おそらく気分に応じて、CStringまたはstd::stringのいずれかを使用しています。したがって、単一の実装(おそらく、これら2つ以外のもの)を選択したいと思います。
MFCのCStringは、コピーオンライト(COW)イディオムに基づいており、マルチスレッド環境では受け入れられないと主張する人もいます(おそらくこの記事を参照してください)。アトミックカウンターは非常に高速であるように思われるため、このような主張には納得できません。また、このオーバーヘッドは、メモリの再割り当ての削減によって何らかの形で補われます。
std :: stringの実装はコンパイラに依存することを学びました。これは、MSVCではCOWではありませんが、gccであるか、そうでした。私が理解している限り、新しいC ++ 0x標準は、COW以外の実装を要求することでこれを修正し、連続したバッファー要件などの他の問題を解決します。したがって、実際にはstd::stringはこの時点では明確に定義されていないように見えます...
std :: stringについて私が気に入らないことの簡単な例:過度の再割り当てなしに関数から文字列を返す方法はありません(値で返す場合はコンストラクターをコピーし、それを最適化するための内部バッファーへのアクセスがないため、「return参照による」例えばstd::string& Result
、役に立たない)。これは、CStringを使用して、値で返す(COWによるコピーなし)か、参照で渡してバッファーに直接アクセスすることで実行できます。繰り返しになりますが、C ++ 0xはその右辺値参照で救助されますが、最も近い機能にC++0xを含めることはありません。
どの文字列クラスを使用する必要がありますか?COWは本当に問題になることができますか?他に一般的に使用される文字列の効率的な実装はありますか?ありがとう。
編集:現時点ではUnicodeを使用しておらず、必要になる可能性はほとんどありません。ただし、Unicodeを簡単にサポートできるものがある場合(ICUを犠牲にすることなく...)、それはプラスになります。