STL 標準では、 from std::string を参照カウントする必要はありません。しかし実際には、ほとんどの C++ 実装は参照カウントされたコピー オン ライト文字列を提供し、文字列をプリミティブ型として値で渡すことができます。また、これらの実装 (少なくとも g++) は、アトミック操作を使用して、これらの文字列をロックフリーにし、スレッドセーフにします。
簡単なテストは、コピーオンライトのセマンティクスを示しています。
#include <iostream>
#include <string>
using namespace std;
void foo(string s)
{
cout<<(void*)s.c_str()<<endl;
string ss=s;
cout<<(void*)ss.c_str()<<endl;
char p=ss[0];
cout<<(void*)ss.c_str()<<endl;
}
int main()
{
string s="coocko";
cout<<(void*)s.c_str()<<endl;
foo(s);
cout<<(void*)s.c_str()<<endl;
}
非定数メンバーが使用された後、2 つのアドレスのみが正確に出力されます。
HP、GCC、Intel コンパイラを使用してこのコードをテストしたところ、同様の結果が得られました。文字列はコピー オン ライト コンテナーとして機能します。
一方、VC++ 2005 では、各文字列が完全にコピーされていることが明確に示されています。
なんで?
私は、VC++6.0 にスレッドセーフではない参照カウントの実装があり、ランダムなプログラム クラッシュを引き起こすバグがあったことを知っています。これが理由ですか?彼らは、それが一般的な慣行であっても、もはや参照カウントを使用することを恐れているだけですか? 問題を修正することよりも、参照カウントをまったく使用しないことを好むのですか?
ありがとう