【发布时间】:2009-04-01 19:33:00
【问题描述】:
STL 标准不要求对 std::string 进行引用。但实际上大部分 C++ 实现提供了 refcounted、copy-on-write 字符串,允许你通过 按值字符串作为原始类型。这些实现(至少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 中存在一个错误,该错误具有非线程安全实现 导致随机程序崩溃的引用计数。这是原因吗?他们只是 害怕再使用引用计数,即使这是常见的做法?他们宁愿不 完全使用引用计数来解决问题?
谢谢
【问题讨论】:
标签: c++ string visual-c++ reference-counting copy-on-write