std::string はどのように実装されていますか? 質問する

std::string はどのように実装されていますか? 質問する

std::string がどのように実装され、それが c 文字列とどう違うのかを知りたいです。標準で実装が指定されていない場合は、標準で指定された文字列要件をどのように満たすかを説明した実装であれば何でも結構です。

ベストアンサー1

私が使用したほぼすべてのコンパイラは、ランタイムのソース コードを提供しています。そのため、GCC や MSVC などを使用しているかどうかに関係なく、実装を確認することができます。ただし、の大部分またはすべてがstd::stringテンプレート コードとして実装されるため、読みにくくなる可能性があります。

スコット・マイヤーの著書「Effective STL」には、std::string の実装に関する章があり、一般的なバリエーションの概要が適切に説明されています。「項目 15:string実装のバリエーションに注意してください」。

彼は4つのバリエーションについて話します:

  • 参照カウント実装のいくつかのバリエーション (一般にコピー オン ライトとして知られています) - 文字列オブジェクトが変更されずにコピーされると、参照カウントは増加しますが、実際の文字列データは増加しません。いずれかのオブジェクトがそれを変更してデータの「コピー オン ライト」が発生するまで、両方のオブジェクトは同じ参照カウント データを指します。バリエーションは、参照カウント、ロックなどの格納場所にあります。

  • 「短い文字列の最適化」(SSO)実装。このバリアントでは、オブジェクトには、データへの通常のポインタ、長さ、動的に割り当てられたバッファのサイズなどが含まれます。ただし、文字列が十分に短い場合は、動的にバッファを割り当てる代わりに、その領域を使用して文字列を保持します。

また、Herb Sutter の「より優れた C++」には付録 (付録 A: 「マルチスレッドの世界では最適化されないもの」) があり、同期の問題により、コピー オン ライトの参照カウント実装がマルチスレッド アプリケーションでパフォーマンスの問題を引き起こすことが多い理由について説明しています。この記事はオンラインでも入手できます (ただし、本の内容とまったく同じかどうかはわかりません)。

どちらの章も読む価値があります。

おすすめ記事