首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于string的Copy-On-Write,该怎么解决

2012-04-01 
关于string的Copy-On-Write看了篇关于string使用Copy-On-Write的文章:http://blog.csdn.net/ckt1120/archi

关于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的环境楼主不妨也再测试下)

热点排行