c++ 11 移动语义
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 移动语义相关推荐
- python数星星_最好的朋友:C++11 移动语义和 Pimpl 手法
使用了挪动语义和 PIMPL 方法的一个类 在我的文章<通过 C++11 挪动语义提升性能>中我们将PIMPL方法应用到了CTeam这个类.// cteam.h #ifndef CTEAM ...
- C++11 移动语义与右值引用
1.移动语义 C++11 新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力.如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升程序性能.参考如下程序: ...
- c++11 移动语义move semantics
performance, expensive object copies move semantics, temporary objects implemented with rvalue refer ...
- 语义SLAM开源代码汇总
作者丨Moonkissu@知乎 来源丨https://zhuanlan.zhihu.com/p/64825421 编辑丨3D视觉工坊 之前做的深度学习闭环检测 这方面,最近想了解下语义这方面,于是总结 ...
- 武汉大学 RSIDEA 团队开源LoveDA:可同时推进语义分割和迁移学习
关注公众号,发现CV技术之美 本文分享论文『LoveDA: A Remote Sensing Land-Cover Dataset for Domain Adaptive Semantic Segme ...
- C++11特性(详细版)
C11 1.C11优势 2.列表初始化 3.变量类型推导 1.为什么需要类型推导 2.decltype类型推导(了解) 为什么需要decltype decltype 4.final 与 overrid ...
- 全网精华之C++11 60篇链接汇总
整理得比较完整的一个C++11系列教程,遵循由浅到深的编排顺序,并且做了大量上机验证和堪误,以及语病和语义通顺修改,呕心沥血,增删改查1年多时间才完成,汇聚csdn.博客园.Google搜索.百度搜索 ...
- 【深度学习】语义分割-综述(卷积)
这里写目录标题 0.笔记参考 1. 目的 2. 困难点 3. 数据集及评价指标 3.1数据集 3.2评价指标 4.实现架构 5. 模型发展 5.1基于全卷积的对称语义分割模型 5.1.1FCN(201 ...
- C++11、C++14、C++17、C++20新特性总结(5万字详解)
文章目录 C++ 11是什么,C++ 11标准的由来 C++ auto类型推导完全攻略 auto 类型推导的语法和规则 auto 的高级用法 auto 的限制 auto 的应用 使用 auto 定义迭 ...
最新文章
- BZOJ 2131 免费的馅饼(DP,二维偏序问题 / 旋转坐标轴转化问题)【BZOJ 修复工程】
- SQL Server 事务日志
- VS 2010 IDE 宏学习总结
- 在 IntelliJ IDEA 中,如何快速将选中文件用资源管理器打开
- div设置宽度,实现不等比缩放,或设置最小宽度 min-width
- 泽西岛/贾克斯RS:流式JSON
- java应用部署docker_Docker部署JavaWeb项目实战
- java zip 文件夹_Java Zip文件文件夹示例
- YII2 搭建redis拓展(教程)
- 背包之01背包、完全背包、多重背包详解
- bat脚本监控tomcat并启动_windows使用批处理发布web到tomcat并启动tomcat脚本分享
- Atitti css transition Animation differ区别
- 史上最全wireshark使用教程,8万字整理总结,建议先收藏再耐心研读
- ndows 内存诊断工具,win10内存诊断工具 win10自带内存诊断工具的使用
- 二维傅里叶变换深度研究-图像与其频域关系
- Eclipse美化操作
- 人的成熟不是年龄,而是懂得了放弃。Python_China的博客
- 服务器系统补丁失败,Windows Server 2016安装累积更新补丁失败
- “你没有权限操作该项”phpcms权限解决一例
- 如何上传到GitHub的main分支而不是master分支
热门文章
- Spring5源码 - 09 循环依赖解读
- 实战SSM_O2O商铺_07【商铺注册】DAO层-新增与更新商铺
- mysql my.ini utf8_修改了my.ini没有效果,MySql的字符集还是没有变成utf8——mysql中文乱码...
- mysql游标进阶_mysql进阶(三)游标简易教程
- 线程池 c linux 编程,关于c++:linux-c编程之高效线程池如何实现无琐化
- php 树形结构实例,如果用php写树形结构?
- 2021-01-13 Linux下安装lua开发环境 Ubuntu
- java怎么解决重复支付问题_支付系统设计中,如何防止重复支付?
- php7.2 swoole_loader,用什么方法可以让swoolec-loader支持php7.3?
- 没有任何基础学编程从哪开始_没有编程基础的朋友,学Python还是C/C++好,看了这个就明白了...