string类型

delphiwcdj 2010-03-24 01:48:15
vc6调试下面代码,s1与s2始终为同一字符串,这是怎么回事?

string s1,s2;
//cin>>s1;
getline(cin,s1);

s2=s1;
//即使改为
string s2(s1);

...全文
346 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphiwcdj 2010-03-24
  • 打赏
  • 举报
回复
关于此贴的总结
http://blog.csdn.net/delphiwcdj/archive/2010/03/24/5412835.aspx

仍有一个问题没有解决。
herman~~ 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jackyjkchen 的回复:]
VC6的string拷贝构造函数采用引用计数,如果两个串一样的就不复制,和gcc一样,性能高但可靠性差(C++对象默认是复制的,但string的做法破坏了C++的默认语义!可能造成混乱,另外多线程程序里,引用计数是个隐患)。

VS2005和VS2008都改了,转为普通复制
[/Quote]

学习
jackyjkchen 2010-03-24
  • 打赏
  • 举报
回复
这实际上也体现了VC6和gcc这种STL机制的缺陷之一,不清楚具体的实现,你可以在GCC上试试
delphiwcdj 2010-03-24
  • 打赏
  • 举报
回复
还是请哪位朋友告知真相。:)
taodm 2010-03-24
  • 打赏
  • 举报
回复
楼主,你需要一本《effective stl》认真读一下。
delphiwcdj 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 taodm 的回复:]
倒!楼主听说过没有:const_cast后果自负!
对于string的c_str是不可以const_cast的,因为其后果会严重依赖你的人品
[/Quote]
有关于const_cast后果的文档说明吗?如果不这样做,在这里要调用strlwr应该如何做呢?
11L代码中,为什么在strtmp改变后,str也随之变呢?
但是10L说的是对的,调试下面代码:

string str,strtmp;
getline(cin,str);

// save
strtmp=str;
strtmp="abc";// 此时,strtmp与str为不同的串
wade_2003 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 taodm 的回复:]
倒!楼主听说过没有:const_cast后果自负!
对于string的c_str是不可以const_cast的,因为其后果会严重依赖你的人品
[/Quote]
以后还是别这样用了,呵呵
taodm 2010-03-24
  • 打赏
  • 举报
回复
倒!楼主听说过没有:const_cast后果自负!
对于string的c_str是不可以const_cast的,因为其后果会严重依赖你的人品
delphiwcdj 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jackyjkchen 的回复:]
我不清楚你定义临时变量的目的是什么,不过你大可以放心的是,即便strtmp和str却是共用了一个字符串地址,但string考虑了移植性,你改变二者中的任何一个,都会分配新的地址而不会造成二者同时改变(这点与直接使用char*不同,与直接使用引用也不同),也就是说,虽然实际上破坏了C++的语义,但在大部分情况下还是可以避免bug的。
[/Quote]
我调试了一下,确实是这样。下面代码,在改变了strtmp的内容后,str也随之改变。

string str,strtmp;
getline(cin,str);

// save
strtmp=str;

string strLwr=strlwr(const_cast<char *>(strtmp.c_str()));// str and strtmp are same addr
jackyjkchen 2010-03-24
  • 打赏
  • 举报
回复
我不清楚你定义临时变量的目的是什么,不过你大可以放心的是,即便strtmp和str却是共用了一个字符串地址,但string考虑了移植性,你改变二者中的任何一个,都会分配新的地址而不会造成二者同时改变(这点与直接使用char*不同,与直接使用引用也不同),也就是说,虽然实际上破坏了C++的语义,但在大部分情况下还是可以避免bug的。


你若却是想让string的字符串复制,要么用VS2008,要么就使用用memcpy到char *
taodm 2010-03-24
  • 打赏
  • 举报
回复
楼主要么先去看过了“提问的智慧”再来?
你都strtmp=str;它们要还不相等,那才叫遇到鬼了呢。你想它们该怎么个不等法吧?
delphiwcdj 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jackyjkchen 的回复:]
你输出c_str(),地址确实是一样的,但你把其中一个string换一下内容,c_str()又变成两个地址了,因为string内容不同了。这是一种性能优化的手段。

gcc的STL在单线程中效率明显高过VS2008的,就是这个原因,但在多线程中,gcc的STL使用需要更小心。
[/Quote]
谢谢。我是想用一个临时的string对象来保存原有的字符串。代码改为:

string str,strtmp=" ";// different addr
//cin>>str;
getline(cin,str);

strtmp=str;// oops, they are same now!
candeabc123 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jackyjkchen 的回复:]
你输出c_str(),地址确实是一样的,但你把其中一个string换一下内容,c_str()又变成两个地址了,因为string内容不同了。这是一种性能优化的手段。

gcc的STL在单线程中效率明显高过VS2008的,就是这个原因,但在多线程中,gcc的STL使用需要更小心。
[/Quote]
看来我是理解错了 晕倒。。。。
还以为楼主问为什么他们的内容是一样呢~
jackyjkchen 2010-03-24
  • 打赏
  • 举报
回复
你输出c_str(),地址确实是一样的,但你把其中一个string换一下内容,c_str()又变成两个地址了,因为string内容不同了。这是一种性能优化的手段。

gcc的STL在单线程中效率明显高过VS2008的,就是这个原因,但在多线程中,gcc的STL使用需要更小心。
BT六眼飞鱼 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jackyjkchen 的回复:]

VC6的string拷贝构造函数采用引用计数,如果两个串一样的就不复制,和gcc一样,性能高但可靠性差(C++对象默认是复制的,但string的做法破坏了C++的默认语义!可能造成混乱,另外多线程程序里,引用计数是个隐患)。

VS2005和VS2008都改了,转为普通复制
[/Quote]
强人!!
taodm 2010-03-24
  • 打赏
  • 举报
回复
用打印,别用调试器。
candeabc123 2010-03-24
  • 打赏
  • 举报
回复
1+1为什么等于2?
jackyjkchen 2010-03-24
  • 打赏
  • 举报
回复
VC6的string拷贝构造函数采用引用计数,如果两个串一样的就不复制,和gcc一样,性能高但可靠性差(C++对象默认是复制的,但string的做法破坏了C++的默认语义!可能造成混乱,另外多线程程序里,引用计数是个隐患)。

VS2005和VS2008都改了,转为普通复制
yuzl32 2010-03-24
  • 打赏
  • 举报
回复
编译器优化了吧。

64,678

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧