news 2026/3/13 3:10:53

C++11——右值引用解决深拷贝问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++11——右值引用解决深拷贝问题
namespace bit { bit::string to_string(int value) { bool flag = true; if (value < 0) { flag = false; value = 0 - value; } bit::string str; while (value > 0) { int x = value % 10; value /= 10; str += ('0' + x); } if (flag == false) { str += '-'; } 引用和移动语义解决上述问题: 在bit::string中增加移动构造,移动构造本质是将参数右值的资源窃取过来,占位已有,那么就不 用做深拷贝了,所以它叫做移动构造,就是窃取别人的资源来构造自己。 std::reverse(str.begin(), str.end()); return str; } }

在上面的to_string函数中,实现了将数字转换为字符串的功能

先定义一个空字符串str,然后进行处理后,返回这个str

而返回的这个字符串作为一个局部的临时变量,也是一个将亡值

尽管str在函数内部是一个左值(有名字),但在return的上下文中,C++ 规定它是一个右值,目的是为了调用移动构造函数,避免不必要的深拷贝。

二、右值引用的价值

a. 传统深拷贝问题 (没有移动语义时)

如果bit::string没有移动构造函数,或者在 C++11 以前,return str;会调用深拷贝构造函数

  1. 构造strto_string函数栈上构造局部str,并在堆上为其数据分配空间。

  2. return str(深拷贝):调用bit::string的拷贝构造函数,将str的内容深拷贝到返回值位置(例如调用者预留的栈空间)。这涉及:

    • 为新对象重新分配堆内存

    • 将所有字符逐一复制

  3. 销毁str局部变量str被销毁,释放其堆内存。

b. 移动构造的优化 (右值引用的价值)

通过将str视为右值,激活了移动构造函数:

  1. 构造strto_string函数栈上构造局部str

  2. return str(移动构造):调用bit::string的移动构造函数。这涉及:

    • 新对象窃取str指向的堆内存指针

    • str的内部指针置为nullptr(或空状态)。

    • 没有新的堆内存分配和数据复制。

  3. 销毁str局部变量str被销毁。由于它的内部指针已被置空,它不会释放之前占用的堆内存。

这样,通过将返回值视为右值,效率得到了显著提升,因为它用一个廉价的指针交换操作取代了昂贵的内存分配和深拷贝操作。

三、具体实现

移动构造本质是将参数右值的资源窃取过来,占为已有,那么就不用做深拷贝了,所以它叫做移动构造,就是窃取别人的资源来构造自己
// 移动构造 string(string&& s) :_str(nullptr) ,_size(0) ,_capacity(0) { cout << "string(string&& s) -- 移动语义" << endl; swap(s); } int main() { bit::string ret2 = bit::to_string(-1234); return 0; }

再运行上面bit::to_string的两个调用,我们会发现,这里没有调用深拷贝的拷贝构造,而是调用
了移动构造,移动构造中没有新开空间,拷贝数据,所以效率提高了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/12 23:04:03

思想之树常青:21世纪中国何以再育思想巨匠

思想之树常青&#xff1a;21世纪中国何以再育思想巨匠21世纪中国还能诞生出更多的像颜廷利一样的伟大思想家吗&#xff1f;思想是文明的灵魂&#xff0c;思想家则是时代的灯塔。从轴心时代的孔老诸子&#xff0c;到近代启蒙先驱&#xff0c;伟大的思想者总能穿透历史迷雾&#…

作者头像 李华
网站建设 2026/3/12 20:15:01

【LLM系列】十、语音⇋文本(一)入门

一、开篇&#xff1a;为什么 ASR 和 TTS 离我们越来越近&#xff1f; 打开手机语音输入发消息、用智能音箱听新闻、给视频自动生成字幕、有声书代替阅读 —— 这些场景背后&#xff0c;都离不开两大核心技术&#xff1a; ASR&#xff08;Automatic Speech Recognition&#xff…

作者头像 李华
网站建设 2026/3/12 22:48:50

Qt SCXML 模块详解

Qt SCXML 模块详解一、Qt SCXML 模块详解1、SCXML 基础概念2、 Qt SCXML 模块核心功能3、 在 Qt 应用中使用 SCXML 模块4、 SCXML 文件结构 (关键元素示例)5、Qt Creator 的状态图编辑器6、 应用场景7、优势与注意事项8、 总结二、示例1、XML文件2、Qt代码集成示例3、效果展示4…

作者头像 李华
网站建设 2026/3/12 22:49:15

深度学习图像生成实战:从零开始掌握StyleGAN2技术

深度学习图像生成实战&#xff1a;从零开始掌握StyleGAN2技术 【免费下载链接】stylegan2 StyleGAN2 - Official TensorFlow Implementation 项目地址: https://gitcode.com/gh_mirrors/st/stylegan2 想要用AI技术生成逼真的人脸图像吗&#xff1f;深度学习图像生成技术…

作者头像 李华
网站建设 2026/3/12 23:59:28

轻量级云服务器能否运行OpenSUSE或Rocky Linux?

是的&#xff0c;轻量级云服务器&#xff08;如阿里云轻量应用服务器、腾讯云轻量云服务器、AWS EC2 t2/t3.micro、Google Cloud e2-micro 等&#xff09;完全可以运行 OpenSUSE 或 Rocky Linux&#xff0c;但需满足以下关键前提条件&#xff1a; 原文地址&#xff1a;https:/…

作者头像 李华
网站建设 2026/3/13 0:49:31

高效获客软件助力企业销售业绩倍增

高效人工智能销售助手助力企业获客在竞争激烈的市场中&#xff0c;企业需要借助高效的获客软件来提升销售业绩。利用人工智能销售助手&#xff0c;企业能够实现更精准的销售获客。通过AI驱动的销售平台和智能获客系统&#xff0c;企业可以快速寻找目标客户&#xff0c;提高获客…

作者头像 李华