网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月30日漏签0天
c++吧 关注:630,979贴子:2,113,877
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 下一页 尾页
  • 44回复贴,共2页
  • ,跳到 页  
<<返回c++吧
>0< 加载中...

我想吐槽一下C++11中的右值引用。。

  • 只看楼主
  • 收藏

  • 回复
  • ashuralyk
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
今天看了下C++11的右值引用,说着什么通过类中的转移构造函数将临时对象的数据区域直接搬到将要构造的对象中,避免了内存的拷贝。我自己试着用代码研究了一下,其实就是浅拷贝和深拷贝的区别而已,也就是说完全可以用拷贝构造函数完成转移构造函数需要完成的功能,只不过我们已经约定熟成用拷贝构造函数进行深拷贝,但有时又因为要提高效率需要浅拷贝,而用拷贝构造函数做浅拷贝又不太好,所以就直接添加了一个转移构造函数做浅拷贝。尼玛,我还意为是什么牛逼的新特性呢,就是让一个类同时具有深拷贝和浅拷贝的功能而已。如果类中根本没有指针成员,那这个特性完全没有意义。。


  • 因为我不敢
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不知道它的用处麻烦去查下.别什么都不知道就在这装.你在项目中用过它么?你试过用浅拷贝代替么?多用几次再来说感想吧.不吹牛不会死的


2025-08-30 18:52:31
广告
不感兴趣
开通SVIP免广告
  • 我变成鱼了
  • <<
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我不说话


  • z什么什么k
  • +
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • 幻の上帝
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
什么深浅乱七八糟的,RVO知道么。


  • 灰色110
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
。我笑了,原来有人和我一开始看的时候犯类似的错误,少年,好好看看这篇文章再说吧:
http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx


  • ashuralyk
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好吧,我不是有意想吵,如果真是我理解错了我道歉,不过我想说一下我现在的理解,C++11中已经可以说明确区分了左值和右值,用vector来说,如果用左值构造一个实例则调用拷贝构造函数,如果用右值构造则调用转移构造函数。如果左值a用std::move强行解释为右值构造一个实例后b,则调用b的转移构造函数,可以看到a.data()直接返回0,而b.data()就是之前a中的,也就是说a中的c-style数组指针直接赋给了b,然后赋值为0,在构造函数中指针的直接赋值而不是另外开辟一块内存空间然后拷贝内存这就是浅拷贝,而这个构造函数是转移构造函数,所以我理解转移构造函数就是专门做浅拷贝的。


  • 良化纲领_
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我觉得区分左值右值就有点无奈的悲剧意味,所以只笑笑。


2025-08-30 18:46:31
广告
不感兴趣
开通SVIP免广告
  • 白晓生锄禾
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主说到我心坎上了
(其实这个东西最让人吐槽的是
本来我一个类需要些
带某些参数的构造函数
默认构造函数
复制构造函数
operator=函数
已经很蛋疼了,好吧,我还得写&&函数。。。。。(其实我从来没写过。。


  • 因为我不敢
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
让一个类同时具有深拷贝和浅拷贝的功能而已
你知道没有这个而已要付出多大的代价么,实现机制的简单与否和它的意义没有必然联系


  • 幻の上帝
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
右值引用存在的最主要的意义其实是和左值引用区分,而不是复制会有什么行为(这只是应用之一)。
要说节约复制开销,RVO/NRVO已经做到了。为什么还要右值引用?因为如果不引入类型系统对转移语义支持,没有什么一般的简单的方法让实现了解什么时候需要“转移”。C++98/03下复杂(到不实用)的方法是有,AA的Mojo。


  • 幻の上帝
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
参考文献
[1] ISO/IEC 14882:1998(E),Information technology — Programming languages — C++[S].Geneva, Switzerland,1998.
[2] ISO/IEC 14882:2003 (E),Information technology — Programming languages — C++[S].Geneva, Switzerland,2003.
[3] ISO/IEC 14882:2011(E),Information technology — Programming languages — C++[S].Geneva, Switzerland,2011.
[4] Andrei Alexandrescu. http://www.drdobbs.com/move-constructors/184403855, 2003-02-01, 2012-11-30.
[5] Howard E. Hinnant, Peter Dimov, Dave Abrahams. A Proposal to Add Move Semantics Support to the C++ Language [J/OL]. C++ Standards Committee Papers, N1377=02-0035 , 2002-09-10. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm
[6] Howard E. Hinnant. A Proposal to Add an Rvalue Reference to the C++ Language, Proposed Wording, Revision 3 .[J/OL]. C++ Standards Committee Papers, N2118=06-0188, 2006-10-19. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html
[7] William M. Miller, Edison Design Group. A Taxonomy of Expression Value Categories [J/OL]. C++ Standards Committee Papers, PL22.16/10-0045 = WG21 N3055, 2010-03-12. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3055.pdf


  • 幻の上帝
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
说到底,这种复杂是很无聊。
杯具的根源有两个:
1.类型系统本来就烂,改进也很不咋地:
http://tieba.baidu.com/p/2272468675
2.C++的复制允许副作用。
这个导致优化受到严重的限制,没法简单消除冗余对象,特别是考虑过程间调用顺序的时候。加上照顾ABI兼容性的传统,跨翻译单元就更别想了。
为了避免太脱离实际的开销,ISO C++ 12.8给这里开了个洞,允许特定情况下(就算存在副作用也可以)省略调用。不伦不类。
右值引用在这里算是相对比较干净的做法了,也允许让用户有更大的控制能力。当然现在的结果是旧的麻烦的东西还是保留着,整体就更麻烦。
上面都是关于copy/move。
第二个坑点就是所谓的perfect forwarding。
原理之一是reference collapse:& && → &;之二是模板实例化对&&的特殊规则。完全又在hack类型系统了……又莫名架空了单一职责。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 44回复贴,共2页
  • ,跳到 页  
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示