vc2012下的std::string好像不支持右值引用语义

youngwolf 2012-10-01 01:31:45
代码:
std::string s("1234567890");
std::string ss(std::move(s));
printf("%p %s\n", s.data(), s.data());
printf("%p %s\n", ss.data(), ss.data());

执行之后,ss仍然重新分配了空间,s的空间仍然存在,只是把第一个字符置成了\0(即变成了一个空字符串),这个不符合c++0x标准啊!是不是要定义什么宏打开某个开关啊?

在linux下就没有问题,ss完全将s的空间拿了过来。
...全文
156 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
youngwolf 2012-10-01
  • 打赏
  • 举报
回复
我是说,std::move(s)之前和之后,内存地址是一样的,这就不对了,你在vc2012和linux下面试一试就知道了,行为不一样。
vc2012对短字符串有优化,才会造成这个“问题”。
youngwolf 2012-10-01
  • 打赏
  • 举报
回复
我是说,std::move(s)之前和之后,内存地址是一样的,这就不对了,你在vc2012和linux下面试一试就知道了,行为不一样。
vc2012对短字符串有优化,才会造成这个“问题”。
qq120848369 2012-10-01
  • 打赏
  • 举报
回复
字符串move/swap后肯定还会new 1 byte, 以便string的析构delete[]能正常工作啊。
qq120848369 2012-10-01
  • 打赏
  • 举报
回复
你打印迭代器的地址意义何在... 费解了.
youngwolf 2012-10-01
  • 打赏
  • 举报
回复
我已经找到问题了,原来是vc2012的string更高级,它有类似于java Integer的优化,当缓存很短的时候(小于16字节),右值引用不会生效,因为它是在栈上分配空间的,再长的就会在堆上分配。
youngwolf 2012-10-01
  • 打赏
  • 举报
回复
楼上没理解我的意思,s.data()就是内部内存的地址啊!
qq120848369 2012-10-01
  • 打赏
  • 举报
回复
s是栈上的, 只是把内部的char*拿走了, 栈上的s怎么会自己消失呢?
youngwolf 2012-10-01
  • 打赏
  • 举报
回复
而vector则完善支持右值引用,比如:

std::vector<int> v;
v.push_back(0);
v.push_back(1);
printf("%p %d\n", &v.front(), v.front());

std::vector<int> vv(std::move(v));
//printf("%p %d\n", &v.front(), v.front()); //这句不能出现在这里,因为v内存已经完全移动到vv了
printf("%p %d\n", &vv.front(), vv.front());

64,653

社区成员

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

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