STL 标准不要求从 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;
}
在使用非常量成员之后,仅打印两个地址。
我使用 HP、GCC 和 Intel 编译器测试了这段代码,得到了类似的结果——字符串作为写时复制容器工作。
另一方面,VC++ 2005 清楚地表明每个字符串都是完全复制的。
为什么?
我知道 VC++6.0 中有一个错误,它具有非线程安全的引用计数实现,导致随机程序崩溃。这是原因吗?他们只是害怕再使用引用计数,即使这是常见的做法?他们宁愿完全不使用引用计数来解决问题?
谢谢