关于string的Copy-On-Write
看了篇关于string使用Copy-On-Write的文章:
http://blog.csdn.net/ckt1120/archive/2007/09/08/1777004.aspx
#include <string>
#include <iostream>
using namespace std;
void main()
{
string str1( "hello world! ");
string str2 = str1;
printf ( "Before Copy-On-Write:\n ");
printf ( "str1 's address: %x\n ", str1.c_str());
printf ( "str2 's address: %x\n ", str2.c_str());
str1[1] = 'q ';
str2[2] = 'g ';
string str3 = str2;
printf ( "\nAfter Copy-On-Write:\n ");
printf ( "str1 's address: %x\n ", str1.c_str());
printf ( "str2 's address: %x\n ", str2.c_str());
printf ( "str3 's address: %x\n ", str3.c_str());
}
有个疑惑想请教:对于str3,我觉得应该是和str2共用一段内存空间,即打印出的地址应该相同。
但是结果却不同?
[解决办法]
我又看了一下, 之前想错了 -_-!
你是对的,如果仅仅是copy-on-write,两种表现是应该一样的。str1变了就是因为copy-on-write了
而实际上真正的表现是不同的, 原因是因为有一种这样的额外的库实现考虑
当你的某个string被修改了,库将知道这个string是被更改了,而且会假定这个string以后会再被更改 或者频繁被更改。
试想我们一向
for (int i=0; i <LEN; i++)
{
s[i] = xxx;
} (不好的风格,just for demo)
很少有单个操作s[1] = x,后就没有了。
实现上,
库会对这样的string做一个标志,使其不参与空间的共享和争用。
任何从其复制构造的string,取得独立的空间,不共享。
在你的测试代码里加上
// str2 is modified (leaked0
string str4 = str3;
string str5 = str2;
printf ( "str4 's address: %x\n ", str4.c_str());
printf ( "str5 's address: %x\n ", str5.c_str());
可以来验证这个。
str3 与 str4相同
str5 还是与str2 不同。
标准库 总是比我们想的远哪.
(我是基于gcc libstdcxx, VC的环境楼主不妨也再测试下)