2

コンパイラは同一の定数文字列リテラルを再利用してメモリを効率的に節約できることがわかっています。この最適化は、コンパイラではオプションです。

2 つの文字列リテラルのポインター値が同じですか?

const char *s1 = "HELLO";
const char *s2 = "HELLO";

s1s2同じアドレスを持つことができます。多くのコンパイラで同じアドレスを持っています。たとえば、どちらも address を指しています0x409044

良い。

私の頭の中の質問は、なぜstd::string同じ利点を得ようとしないのですか? std::stringそして、そのアドレスをラップするだけではありません。

const std::string ss1("HELLO");
const std::string ss2("HELLO");

cout << (void*) ss1.c_str() << endl;
cout << (void*) ss2.c_str() << endl;

ss1ss22 つの異なるアドレスを持っています。

技術的に不可能ですか?言語で禁止されていますか?それとも、標準ライブラリの実装の開発者はそれを望んでいないのでしょうか?

4

2 に答える 2

5

C++ 標準ライブラリ クラスは概してすべて、強力な値セマンティクスを実装しています。これは、各オブジェクトがすべてのデータを所有していることを意味するため、オブジェクトの有効期間は簡単に推測できます。参照追跡の実装は可能かもしれませんが、それにはかなりの複雑さが伴い、C++ の「求めていないものにはお金を払わない」という哲学には合いません。

所有していない文字列のようなクラス (検索したい場合はstring_refandのようなもの) について長い間議論されてきましたが、これは既存の文字列のビューにすぎません。これは、基礎となる共有データの有効期間がアプリケーションに適合することを保証するために、ユーザーに負担をかけることになります。将来的には標準の一部になる可能性がありますが、興味がある場合は既存の実装を検索してください。array_ref

于 2013-05-06T17:15:08.653 に答える
0

この動作の理由の 1 つは、オブジェクトのメモリ管理にある可能性があります。

オブジェクトは、そのstd::string文字配列を担当します。これは、std::stringデストラクタで配列が削除されることを意味し、そのような配列は一度だけ削除する必要があります。

として宣言された C char 配列では

const char* bla = "blabla";

解放されているか、解放されるべきではありません。

于 2014-07-31T08:06:48.357 に答える