1

文字列オブジェクトをパラメーターとして使用する関数を作成しました。

void func(string str)

GDB を使用して Linux でデバッグすると、 が対応する引数 pass( )strと同じ値を持つことがわかりました。 _M_ptest_string

str同じ文字列データをtest_string共有するということですか?
その理由は何ですか?
コピーコンストラクタによるビットコピー処理と関係ありますか?

4

3 に答える 3

4

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
于 2013-01-01T09:55:15.597 に答える
1

GCC には、std::string のコピー オン ライト (COW) 実装がありました。つまり、動的に割り当てられたリソースのコピーは、必要な場合にのみ発生します。

コピー コンストラクターの既定の実装とは関係がなく、std::string の COW 実装には、何かを行うコピー コンストラクターが必要です (表現は共有されるため、変更が発生した場合はコピーする必要があることに注意してください)。

于 2013-01-01T09:54:40.673 に答える
1

ライブラリの作成者はstd::string、何らかの形式のコピー オン ライト最適化を実装できます。文字列をコピーすると (この例で起こっているように)、2 つのコピーが文字列データを共有します。データの実際のコピー (コストがかかる可能性があります) は、2 つの文字列のいずれかが実際に変更された場合にのみ発生します。

これは一般に、コピーが作成されるたびにデータ全体をコピーするよりも効率的です。(ただし、特にスレッドセーフには注意が必要です。)

この記事は興味深いかもしれません: C++ String Performance、このタイプの実装について言及しています。

于 2013-01-01T09:55:01.003 に答える