string str1 = "sdfsdffdf";
string str2 = str1;
单这两句是看不出有什么区别的,但在不同系统下区别已经开始了!
分别打印string的存储数据的地址:
const char *p1 = str1.c_str();
const char *p2 = str2.c_str();
cout.unsetf( ios_base::dec );
cout.setf( ios_base::hex );
cout<<(int)p1<
在Window下输出是:
12ff4c
12ff14
在linux下输出是:
2830104c
2830104c
现在看到区别了吧!在linux下两个不同的字符串竟然是指向同一块内存,而window下是指向不同的内存!也就是说window下的是真正意义上的两个string字符串。而linux的不是真正意义上的字符串?
为验证这点,在linux下,在程序里面加多个下面这句:
transform (str2.begin(), str2.end(), str2.begin(), (int(*)(int))tolower); // #include
然后在输出指针所指的地址来看看:
cout<<(int)p1<
2830104c
2830106c
对比一下前面的输出,发现第二个字符串的地址变了,什么时候变的?
经过实验发现,原来linux下的string模板有点奸诈!比如对于最上面的两句程序,它会发现你并没有对strS2进行了实质性的操作,因为程序只是打印了一下地址而已,所以它就不给strS2分配空间来保存strS1的字符串!但它把strS2的指针指向了strS1的地址空间了!有点变态了。但如果在程序后面加多个对strS2进行操作的transform函数后会发现,系统给strS2分配了空间!对于这个本人有点郁闷,因为我写个C的函数对strS2进行操作,系统没给strS2分配空间!只能是g++在对strS2的空间分配的判断上,只能根据C++的操作函数,发现有使用了,然后才分配空间!
据说linux下的这个特性是为了提高程序运行速度的!好像是。
ufwt 于 2008-08-17 01:16:16发表:
这个是stl的问题
linux的stl的string实现是copy on write的
windows的不是,
就怎么简单