C++中的移动构造函数

C++中的移动构造函数

所谓移动语义,指的就是以移动而非深拷贝的方式初始化含有指针成员的类对象。简单的理解,移动语义指的就是将其他对象(通常是临时对象)拥有的内存资源“移为已用”。

以前面程序中的 demo 类为例,该类的成员都包含一个整形的指针成员,其默认指向的是容纳一个整形变量的堆空间。当使用 get_demo() 函数返回的临时对象初始化 a 时,我们只需要将临时对象的 num 指针直接浅拷贝给 a.num,然后修改该临时对象中 num 指针的指向(通常另其指向 NULL),这样就完成了 a.num 的初始化。

事实上,对于程序执行过程中产生的临时对象,往往只用于传递数据(没有其它的用处),并且会很快会被销毁。因此在使用临时对象初始化新对象时,我们可以将其包含的指针成员指向的内存资源直接移给新对象所有,无需再新拷贝一份,这大大提高了初始化的执行效率。

由于 C++的特征和需求,有些情况下对象会自动被复制。请看下面的代码:

class MyString
{// pick implementation from Listing 9.9
};MyString Copy(MyString& source) // function
{MyString copyForReturn(source.GetString()); // create copyreturn copyForReturn; // return by value invokes copy constructor
}int main()
{MyString sayHello ("Hello World of C++");MyString sayHelloAgain(Copy(sayHello)); // invokes 2x copy constructorreturn 0;
}

正如注释指出的,实例化 sayHelloAgain 时,由于调用了函数 Copy(sayHello),而它按值返回一个 MyString,因此调用了复制构造函数两次。然而,这个返回的值存在时间很短,且在该表达式外不可用。因此, C++编译器严格地调用复制构造函数反而降低了性能,如果复制的对象很大,对性能的影响将很严重。
为避免这种性能瓶颈, C++11 引入了移动构造函数。移动构造函数的语法如下:

// move constructor
MyString(MyString&& moveSource)
{if(moveSource.buffer != NULL){buffer = moveSource.buffer; // take ownership i.e. 'move'moveSource.buffer = NULL; // set the move source to NULL}
}

有移动构造函数时,编译器将自动使用它来“移动”临时资源,从而避免深复制。实现移动构造函数后,应将前面的注释改成下面这样:

MyString sayHelloAgain(Copy(sayHello)); // invokes 1x copy, 1x move constructors

移动构造函数通常是利用移动赋值运算符实现的。该示例程序是一个更好的 MyString 版本,实现了移动构造函数和移动赋值运算符。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/130654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅述边缘计算场景下的云边端协同融合架构的应用场景示例

云计算正在向一种更加全局化的分布式节点组合形态进阶,而边缘计算是云计算能力向边缘侧分布式拓展的新触角。随着城市建设进程加快,海量设备产生的数据,若上传到云端进行处理,会对云端造成巨大压力。如果利用边缘计算来让云端的能…

dubbo集群容错策略

相关参数在 org.apache.dubbo.common.constants.ClusterRules 策略名称作用使用场景 failover 失败启动切换 当出现失败会重试其他服务器,会带来更长延迟,通过 retries2 来设置重试次数(不含第一次) 通常用于读操作 failfast …

Vert.x学习笔记-Vert.x的基本处理单元Verticle

Verticle介绍 Verticle是Vert.x的基本处理单元,Vert.x应用程序中存在着处理各种事件的处理单元,比如负责HTTP API响应请求的处理单元、负责数据库存取的处理单元、负责向第三方发送请求的处理单元。Verticle就是对这些功能单元的封装,Vertic…

使用趋动云部署ChatGLM3-6B模型

使用趋动云部署ChatGLM3-6B模型 1 创建项目2 配置环境 修改代码3 运行代码 1 创建项目 创建项目 进入项目 -> 运行代码 -> 选择资源(B1.large) 2 配置环境 修改代码 等待开发者工具加载完成 -> 点击 JupyterLab 进入开发环境 打开 termin…

10.MySQL事务(上)

个人主页:Lei宝啊 愿所有美好如期而遇 目录 前言: 是什么? 为什么? 怎么做? 前言: 本篇文章将会说明什么是事务,为什么会出现事务?事务是怎么做的? 是什么? 我…

C++类中无默认构造函数的情况

C类中无默认构造函数的情况 构造函数的重载的判断条件是:参数的个数或者类型不同,其他要保持一样。 默认构造函数:在建立对象时候不必给出实参的构造函数,称为默认构造函数,显然,无参构造函数属于默认构造函数&#…

C++二分查找算法的应用:长度递增组的最大数目

本文涉及的基础知识点 二分查找 题目 给你一个下标从 0 开始、长度为 n 的数组 usageLimits 。 你的任务是使用从 0 到 n - 1 的数字创建若干组,并确保每个数字 i 在 所有组 中使用的次数总共不超过 usageLimits[i] 次。此外,还必须满足以下条件&…

【Python实例】netCDF数据介绍及处理

netCDF数据处理 netCDF数据介绍1 netCDF数据结构1.1 维度(Dimensions)1.2 变量(Variables)1.3 坐标变量(Coordinate Variables)1.4 属性(Attributes) 2 netCDF数据处理方法1:利用netCDF4打开nc格式数据2.1.…

AI人工智能大模型应用如何落地?

人工智能大模型是近年来人工智能领域的一项重要技术突破,其具备强大的计算能力和学习能力,能够处理大规模的数据和复杂的任务。 然而,要将人工智能大模型应用落地并实现实际价值,还需要克服一些挑战和问题。 首先,人…

华为升腾C92安装windows NAS

华为升腾C92安装windows NAS NAS(Network Attached Storage:网络附属存储),我们之前所了解的群晖,也仅仅是NAS当中的一个品牌运营而已。 这次,我决定在C92上面试着安装Windows NAS。虽然群晖NAS是基于Linu…

OpenCV官方教程中文版 —— 图像去噪

OpenCV官方教程中文版 —— 图像去噪 前言一、原理二、OpenCV 中的图像去噪1.cv2.fastNlMeansDenoisingColored()2.cv2.fastNlMeansDenoisingMulti() 前言 目标 • 学习使用非局部平均值去噪算法去除图像中的噪音 • 学习函数 cv2.fastNlMeansDenoising(),cv2.fa…

Breakpad在Windows,Linux双平台编译、集成以及dump文件的分析

Breakpad在Windows,Linux双平台编译、集成以及dump文件的分析 1、Windows平台 Windows平台上非常好的参考文档: https://r12f.com/posts/google-breakpad-1-introduction-with-windows/ https://r12f.com/posts/google-breakpad-2-implementations-o…

安全模型的分类与模型介绍

安全模型的分类 基本模型:HRU机密性模型:BLP、Chinese Wall完整性模型:Biba、Clark-Wilson BLP模型 全称(Bell-LaPadula)模型,是符合军事安全策略的计算机安全模型。 BLP模型的安全规则: 简…

【大数据】Apache NiFi 数据同步流程实践

Apache NiFi 数据同步流程实践 1.环境2.Apache NIFI 部署2.1 获取安装包2.2 部署 Apache NIFI 3.NIFI 在手,跟我走!3.1 准备表结构和数据3.2 新建一个 Process Group3.3 新建一个 GenerateTableFetch 组件3.4 配置 GenerateTableFetch 组件3.5 配置 DBCP…

答题测评考试小程序的效果如何

在线答题系统是一种在线练习、考试、测评的智能答题系统,适用于企业培训、测评考试、知识竞赛、模拟考试等场景,管理员可任意组题、随机出题,答题者成功提交后,系统自动判分。 多种题目类型,两种答题模式 练习模式&a…

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題 新搭建的FLINK集群出现的问题汇总 1.新搭建的Flink集群和Hadoop集群无法正常启动Flink任务 查看这个提交任务的日志无法发现有用的错误信息。 进一步查看yarn日志: 发现只有JobManager的错误日志出现了如下的…

请求地址‘/operlog‘,发生未知异常

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是全栈工…

[nodejs] 爬虫加入并发限制并发实现痞客邦网页截图

今晚想给偶像的相册截个图,避免某一天网站挂了我想看看回忆都不行,用的是js的木偶师来爬虫台湾的部落格,效果图大概是这样,很不错 问题来了.我很贪心, 我想一次性把相册全爬了,也就是并发 ,这个人的相册有19个!!我一下子要开19个谷歌浏览器那个什么进程, 然后程序就崩了, 我就想…

软件设计模式原则(二)开闭原则

继续讲解第二个重要的设计模式原则——开闭原则~ 一.定义 开闭原则,在面向对象编程领域中,规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意…

半导体芯片制造行业MES系统解决方案

半导体产业作为现代电子科技的重要支柱,驱动着电子设备和通信技术的飞速发展。随着技术不断演进,半导体制造企业面临着越来越多的挑战,如高度复杂的工艺流程、全球化的竞争、质量控制的要求以及能源效率等问题。 为了应对这些挑战&#xff0…