神厨小福贵! 2022-02-12 16:37 采纳率: 100%
浏览 56
已结题

【C++】为什么这里会调用移动构造函数

img

在主函数中首先构建了s1对象 第二步调用fun函数,fun函数中创建了s2对象,拿yhping初始化s2对象,然后return s2的时候,正常情况下会有一个无名对象到主函数的栈帧,然后析构s2对象,当fun将s2对象中的yhpiing赋值给s1的时候,无名对象被释放 正常逻辑是这样的
但是当给到移动构造函数的时候 为啥return s2的时候 就会调用移动构造函数了 还有就是是如何调用这个函数的呢

  • 写回答

4条回答 默认 最新

  • _GX_ 2022-02-13 08:03
    关注

    在没有编译器优化的情况下,如果一个函数按值返回并且返回值类型定义了移动构造函数,那么编译器会调用移动构造函数来构造函数的返回值临时对象。如果返回值类型没有定义移动构造函数,那么编译器会调用拷贝构造函数来构造返回值临时对象。
    不过现在主流C++编译器都默认打开了返回值优化(RVO),所以前面两种情况,调用移动构造函数或拷贝构造函数直接被优化掉了。
    当然编译的时候你可以关闭RVO优化选项(比如g++ -fno-elide-constructors),就可以看到移动构造函数或拷贝构造函数被调用的情况。

    注意移动构造函数和移动赋值运算符里,是直接拷贝指针的,而不是字符串拷贝,所以效率高。并且右值引用对象里的指针被置空,所以当右值引用对象析构时,不会释放原来的字符串。

    参考
    https://en.cppreference.com/w/cpp/language/move_constructor

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月13日
  • 已采纳回答 2月13日
  • 创建了问题 2月12日

悬赏问题

  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上