C++ 已经拥有了拷贝构造函数, 和赋值函数,它们主要定位为浅和深度拷贝, 新增加一个移动构造函数,主要避免拷贝构造。

在定义了移动构造函数的情况下,在实参(argument)是一个右值(rvalue,包括xvalue和prvalue)的情况下会调用移动构造函数,而不是调用复制构造函数

可以使用std::move语句可以将左值变为右值而避免拷贝构造,修改代码如下:

编译器会对返回值进行优化,简称RVO,是编译器的一项优化技术,它涉及(功能是)消除为保存函数返回值而创建的临时对象。

-fno-elide-constructors,此选项作用是,在 g++ 上编译时关闭 RVO。

shell> g++ main.cpp -std=c++11 -fno-elide-constructors

#include <iostream>
using namespace std;class Test
{
public:Test(int a = 0){d = new int(a);cout << "cs" << this <<endl;}Test(const Test & tmp){d = new int;*d = *(tmp.d);cout << "copy\n";}//    Test(Test && tmp)
//    { // 移动构造函数
//        d = tmp.d;
//        tmp.d = NULL; // 将临时值的指针成员置空
//        cout << "mv" << this << endl;
//    }~Test(){if(d != NULL){delete d;cout << "delete d\n";}cout << "ds: " << this << endl;}int * d;
};Test GetTmp()
{Test h;cout << "Resource from " << __func__ << ": " << (void *)h.d << endl;return h;
}int main()
{//Test&& obj = GetTmp();Test obj = GetTmp();cout << "Resource from " << __func__ << ": " << (void *)obj.d << endl;return 0;
}

  

  使用移动语义后

#include <iostream>
using namespace std;class Test
{
public:Test(int a = 0){d = new int(a);cout << "cs" << this <<endl;}Test(const Test & tmp){d = new int;*d = *(tmp.d);cout << "copy\n";}Test(Test && tmp){ // 移动构造函数d = tmp.d;tmp.d = NULL; // 将临时值的指针成员置空cout << "mv" << this << endl;}~Test(){if(d != NULL){delete d;cout << "delete d\n";}cout << "ds: " << this << endl;}int * d;
};Test GetTmp()
{Test h;cout << "Resource from " << __func__ << ": " << (void *)h.d << endl;return h;
}int main()
{Test&& obj = GetTmp();cout << "Resource from " << __func__ << ": " << (void *)obj.d << endl;return 0;
}

  

  

int main()
{//Test&& obj = GetTmp();Test obj = GetTmp();cout << "Resource from " << __func__ << ": " << (void *)obj.d << endl;return 0;
}

  

c++ 11 移动语义相关推荐

  1. python数星星_最好的朋友:C++11 移动语义和 Pimpl 手法

    使用了挪动语义和 PIMPL 方法的一个类 在我的文章<通过 C++11 挪动语义提升性能>中我们将PIMPL方法应用到了CTeam这个类.// cteam.h #ifndef CTEAM ...

  2. C++11 移动语义与右值引用

    1.移动语义 C++11 新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力.如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升程序性能.参考如下程序: ...

  3. c++11 移动语义move semantics

    performance, expensive object copies move semantics, temporary objects implemented with rvalue refer ...

  4. 语义SLAM开源代码汇总

    作者丨Moonkissu@知乎 来源丨https://zhuanlan.zhihu.com/p/64825421 编辑丨3D视觉工坊 之前做的深度学习闭环检测 这方面,最近想了解下语义这方面,于是总结 ...

  5. 武汉大学 RSIDEA 团队开源LoveDA:可同时推进语义分割和迁移学习

    关注公众号,发现CV技术之美 本文分享论文『LoveDA: A Remote Sensing Land-Cover Dataset for Domain Adaptive Semantic Segme ...

  6. C++11特性(详细版)

    C11 1.C11优势 2.列表初始化 3.变量类型推导 1.为什么需要类型推导 2.decltype类型推导(了解) 为什么需要decltype decltype 4.final 与 overrid ...

  7. 全网精华之C++11 60篇链接汇总

    整理得比较完整的一个C++11系列教程,遵循由浅到深的编排顺序,并且做了大量上机验证和堪误,以及语病和语义通顺修改,呕心沥血,增删改查1年多时间才完成,汇聚csdn.博客园.Google搜索.百度搜索 ...

  8. 【深度学习】语义分割-综述(卷积)

    这里写目录标题 0.笔记参考 1. 目的 2. 困难点 3. 数据集及评价指标 3.1数据集 3.2评价指标 4.实现架构 5. 模型发展 5.1基于全卷积的对称语义分割模型 5.1.1FCN(201 ...

  9. C++11、C++14、C++17、C++20新特性总结(5万字详解)

    文章目录 C++ 11是什么,C++ 11标准的由来 C++ auto类型推导完全攻略 auto 类型推导的语法和规则 auto 的高级用法 auto 的限制 auto 的应用 使用 auto 定义迭 ...

最新文章

  1. BZOJ 2131 免费的馅饼(DP,二维偏序问题 / 旋转坐标轴转化问题)【BZOJ 修复工程】
  2. SQL Server 事务日志
  3. VS 2010 IDE 宏学习总结
  4. 在 IntelliJ IDEA 中,如何快速将选中文件用资源管理器打开
  5. div设置宽度,实现不等比缩放,或设置最小宽度 min-width
  6. 泽西岛/贾克斯RS:流式JSON
  7. java应用部署docker_Docker部署JavaWeb项目实战
  8. java zip 文件夹_Java Zip文件文件夹示例
  9. YII2 搭建redis拓展(教程)
  10. 背包之01背包、完全背包、多重背包详解
  11. bat脚本监控tomcat并启动_windows使用批处理发布web到tomcat并启动tomcat脚本分享
  12. Atitti css transition Animation differ区别
  13. 史上最全wireshark使用教程,8万字整理总结,建议先收藏再耐心研读
  14. ndows 内存诊断工具,win10内存诊断工具 win10自带内存诊断工具的使用
  15. 二维傅里叶变换深度研究-图像与其频域关系
  16. Eclipse美化操作
  17. 人的成熟不是年龄,而是懂得了放弃。Python_China的博客
  18. 服务器系统补丁失败,Windows Server 2016安装累积更新补丁失败
  19. “你没有权限操作该项”phpcms权限解决一例
  20. 如何上传到GitHub的main分支而不是master分支

热门文章

  1. Spring5源码 - 09 循环依赖解读
  2. 实战SSM_O2O商铺_07【商铺注册】DAO层-新增与更新商铺
  3. mysql my.ini utf8_修改了my.ini没有效果,MySql的字符集还是没有变成utf8——mysql中文乱码...
  4. mysql游标进阶_mysql进阶(三)游标简易教程
  5. 线程池 c linux 编程,关于c++:linux-c编程之高效线程池如何实现无琐化
  6. php 树形结构实例,如果用php写树形结构?
  7. 2021-01-13 Linux下安装lua开发环境 Ubuntu
  8. java怎么解决重复支付问题_支付系统设计中,如何防止重复支付?
  9. php7.2 swoole_loader,用什么方法可以让swoolec-loader支持php7.3?
  10. 没有任何基础学编程从哪开始_没有编程基础的朋友,学Python还是C/C++好,看了这个就明白了...