文字列オブジェクトをパラメーターとして使用する関数を作成しました。
void func(string str)
GDB を使用して Linux でデバッグすると、 が対応する引数 pass( )str
と同じ値を持つことがわかりました。 _M_p
test_string
str
同じ文字列データをtest_string
共有するということですか?
その理由は何ですか?
コピーコンストラクタによるビットコピー処理と関係ありますか?
文字列オブジェクトをパラメーターとして使用する関数を作成しました。
void func(string str)
GDB を使用して Linux でデバッグすると、 が対応する引数 pass( )str
と同じ値を持つことがわかりました。 _M_p
test_string
str
同じ文字列データをtest_string
共有するということですか?
その理由は何ですか?
コピーコンストラクタによるビットコピー処理と関係ありますか?
GCC の C++ 文字列の実装では、パフォーマンスの問題のためにコピー オン ライト戦略が使用されます。http://en.wikipedia.org/wiki/Copy-on-writeを参照
std::string x("Hello");
std::string y = x; // x and y use the same buffer
y += ", World!"; // now y uses a different buffer
// x still uses the same old buffer
GCC には、std::string のコピー オン ライト (COW) 実装がありました。つまり、動的に割り当てられたリソースのコピーは、必要な場合にのみ発生します。
コピー コンストラクターの既定の実装とは関係がなく、std::string の COW 実装には、何かを行うコピー コンストラクターが必要です (表現は共有されるため、変更が発生した場合はコピーする必要があることに注意してください)。
ライブラリの作成者はstd::string
、何らかの形式のコピー オン ライト最適化を実装できます。文字列をコピーすると (この例で起こっているように)、2 つのコピーが文字列データを共有します。データの実際のコピー (コストがかかる可能性があります) は、2 つの文字列のいずれかが実際に変更された場合にのみ発生します。
これは一般に、コピーが作成されるたびにデータ全体をコピーするよりも効率的です。(ただし、特にスレッドセーフには注意が必要です。)
この記事は興味深いかもしれません: C++ String Performance、このタイプの実装について言及しています。