编程笔记 - C++ 移动语义

news/2025/10/8 11:12:16/文章来源:https://www.cnblogs.com/wenbinteng/p/19129316

C++11 引入了移动语义,它的出现主要是为了解决对象频繁拷贝带来的性能开销问题。移动语义的核心思想是:当对象的资源不再需要时,可以“转移”它的内部资源,而不是进行昂贵的深拷贝。

背景

在传统 C++ 中,函数参数传递或者返回值通常依赖拷贝构造函数。比如,在调用函数前,通常需要在调用者的作用域中创建一个(右值)对象,然后作为参数传递到函数内部,根据传入的参数创建对象,这一过程就产生了拷贝开销。再比如,在函数返回时,需要将函数内部创建的对象作为返回值返回,也需要进行对象拷贝,函数内的对象离开了作用域就会被销毁。

std::string foo() {std::string s = "hello world";return s;
}
左值与右值

简单地说,C++ 中的左值(lvalue)是指向内存区域的变量,它可以出现在赋值表达式的左边或者右边;右值(rvalue)是不可寻址的常量,或者在表达式求值过程中无名的临时对象,只能出现在赋值表达式的右边。

左值引用和右值引用

左值引用就是对变量的引用,对左值引用的操作就是对应内存的操作,一般声明语法是 T&。右值引用用于绑定一个临时的对象,并延长其生命周期到作用域结束,一般声明语法是 T&&

移动构造和移动赋值

为了解决拷贝开销,C++11 引入了移动构造函数和移动赋运算符,它们的函数签名如下:

class MyClass {
public:MyClass(MyClass&& other);            // 移动构造MyClass& operator=(MyClass&& other); // 移动赋值
};

示例

#include <iostream>
#include <vector>class Buffer {int* data;size_t size;
public:Buffer(size_t n) : size(n), data(new int[n]) {std::cout << "Construct\n";}~Buffer() {delete[] data;}// 拷贝构造Buffer(const Buffer& other) : size(other.size), data(new int[other.size]) {std::cout << "Copy Construct\n";std::copy(other.data, other.data + size, data);}// 移动构造Buffer(Buffer&& other) noexcept : size(other.size), data(other.data) {std::cout << "Move Construct\n";other.data = nullptr;other.size = 0;}
};int main() {std::vector<Buffer> vec;vec.reserve(2);vec.push_back(Buffer(10)); // 临时对象 => 移动构造Buffer b(20);vec.push_back(std::move(b)); // 显式转移 => 移动构造
}

运行结果

Construct
Move Construct
Construct
Move Construct

可以看到,上述两个操作都没有触发拷贝构造。第一次调用 push_back() 时传入的是临时构造的一个 Buffer 对象,它是右值,因此被 Buffer(Buffer&& other) 构造函数捕获,将这个临时对象的所有权转移到当前对象。

第二次调用 push_back() 时传入的是 std::move(b),这里 move 是一个类型转换工具,用于将左值强制转换为右值引用,以便触发移动语义。因此,当前对象使用传入的 b 的右值引用进行移动构造,将 b 的所有权转移到当前对象。此时 b 的状态被置为资源已转移但仍可析构的状态,不应再使用原有的内容。

总而言之,C++ 移动语义通过右值引用支持资源转移,避免拷贝开销。std::move() 用于显式地出发移动语义,使用后的对象处于“已转移”的状态。C++ 的移动语义常用于函数参数传递、函数返回值传递、容器和字符串插入等场景。

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

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

相关文章

2025 年最新推荐压电陶瓷制造厂家:深度解析品牌价值、市场影响力及高性价比选型指南高D33/pzt/高性能/替代进口/高稳定性压电陶瓷厂家推荐

随着工业制造向高端化、智能化转型,压电陶瓷作为核心功能性材料,在航空航天、精密电子、工业监测等领域的应用愈发关键,对其性能、稳定性及定制化能力的要求也持续攀升。当前市场中,压电陶瓷品牌数量众多,但技术实…

大学网站建设的意义成都手工活外发加工网

目录前期准备安装ROS初始化rosdep测试前期准备 WSL的安装见旧版 WSL 的手动安装步骤从步骤4开始弄。 图形界面安装见在WSL中使用GPU&#xff1a;WSL2 Ubuntu 18.04 CUDA Gnome图形界面环境配置 界面汉化见WSL-Ubuntu安装中文语言 这里使用鱼香ROS大佬的一键安装脚本&…

ros2 学习笔记

新vm镜像,开启远程 https://blog.csdn.net/qq_42417071/article/details/138501673 安装ros2和gazebo https://blog.csdn.net/maizousidemao/article/details/144008825 https://blog.csdn.net/qq_38880380/article/de…

对vue的疑惑

为什么有些vue的指令用=给值有些指令用:给值在 Vue 的模板语法中,= 和 : 用于不同的场景,主要区别在于它们绑定的值的类型: 1. =(普通属性绑定,字符串字面量)用于 非动态的字符串值,直接传递静态字符串。 示例…

2025 年最新保温装饰一体板厂家口碑排行榜:优选西宁及全国靠谱生产厂家,助力建筑项目精准选品装配式一体板 / 装配式复合一体板 / 珍珠岩复合保温一体板 / 免拆保温一体板厂家推荐

当前建筑建材行业中,保温装饰一体板因兼具保温与装饰双重功能,成为建筑节能改造、新房建设的核心材料之一,市场需求逐年攀升。但行业乱象也让采购方面临诸多难题:部分厂商以次充好,用劣质原料生产的产品保温性差、…

2025 年景观石厂家最新推荐榜单:千层石 / 泰山石等各类景观石优质企业全方位解析及选购指南驳岸石/太湖石/龟纹石/草坪石景观石厂家推荐

当前园林景观行业飞速发展,景观石作为核心构成元素,市场需求日益旺盛,但行业乱象却让消费者选购难度陡增。部分企业过度开采导致优质景观石资源枯竭、破坏环境,产品同质化严重缺乏创新,技术水平不足难以满足个性化…

浏览器标签管理

缘起平时在chrome浏览器和edge浏览器看到一些好用的网站,就收藏到浏览器收藏夹,虽然登陆后有云备份功能,但随着收藏夹的增多,也不好整理。 最近看到B站影月月的置顶动态攻略 原神攻略大全/攻略目录/随版本持续更新…

wordpress 音乐cms站长工具seo综合查询分析

瀑布流布局是一种比较流行的页面布局方式&#xff0c;最典型的就是Pinterest.com&#xff0c;每个卡片的高度不都一样&#xff0c;形成一种参差不齐的美感。 在HTML5中&#xff0c;我们可以找到很多基于jQuery之类实现的瀑布流布局插件&#xff0c;轻松做出这样的布局形式。在…

常用的网站开发技术有哪几种农产品的网站建设方案以及范文

打造销售型网站的订单系统。不是所有销售都有权限登陆网站后台查看订单&#xff0c;特别是外地出差时&#xff0c;用户下了订单后不能及时服务用户&#xff0c;可能会造成订单丢失。但dedecms默认的订单提交后只能在后台看到的&#xff0c;每次都要登陆到后台去查看很麻烦。以下…

勒索软件攻击导致欧洲机场系统瘫痪

欧盟网络安全机构确认欧洲多国机场运营中断由勒索软件攻击引起,攻击目标为提供值机系统的技术供应商,导致值机流程混乱、航班延误和取消。欧盟网络安全机构确认勒索软件攻击导致机场运营中断 根据欧盟网络安全机构EN…

【Java】CopyOnWriteArrayList - 指南

【Java】CopyOnWriteArrayList - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

小说网站wordpress情侣博客网站模板下载

文章目录 域对象共享数据一、三种域对象二、通过ServletAPI向Request域对象共享数据三、使用ModelAndView向Request域对象共享数据四、使用Model向Request域对象共享数据五、使用Map向Request域对象共享数据六、使用ModelMap向Request域对象共享数据七、向Session域对象共享数据…

2025 年保温板生产厂家最新推荐榜单:覆盖一体化 / 免拆模 / LS 外模等多类型产品,助力建筑企业精准挑选优质供应商

当前建筑行业对保温板的需求日益攀升,既要满足节能减排的政策要求,又要适配多样化的建筑施工场景,如装配式建筑、被动式建筑等。但市场上保温板厂家数量众多,产品质量差异悬殊,部分厂家缺乏核心技术,产品存在防火…

测试程序运行所用的时间

测试程序运行所用的时间#include <iostream> #include <ctime> using namespace std; int main() {clock_t start = clock();long long s = 0;for (long long i = 1; i <= 1000000000; i++) {s += i *…

Chintai利用EOSIO区块链技术实现数字资产自动化金融

Chintai基于EOSIO区块链构建合规数字资产平台,通过智能合约实现自动化合规检查、地理围栏和审计追踪,为金融机构大幅降低合规成本并提升交易安全性。Chintai利用EOSIO自动化数字资产推动金融未来 EOS VC资助项目Chin…

cssDay1

CSS 如何学习CSS是什么 CSS怎么用(快速入门) CSS选择器(重点+难点) 美化网页(文字,阴影,超链接,列表,渐变...) 盒子模型 浮动 定位 网页动画(特效 了解)什么是CSS Cascading Style Sheet 层叠级联样式表 C…

高端品牌网站建设公司哪家好重庆网站制作公司多少钱

Spring Boot Vue 图书馆管理系统&#xff08;library-system&#xff09; 本地快捷预览项目 第一步&#xff1a;运行 db 文件夹下的springboot-vue.sql(询问作者获取)&#xff0c;创建springboot-vue数据库 第二步&#xff1a;修改后端数据库配置文件&#xff0c;启动后端 …

【C#朗读文本DLL动态按钮控件组及按钮事件文本框拖放数据】2022-1-21 - 详解

【C#朗读文本DLL动态按钮控件组及按钮事件文本框拖放数据】2022-1-21 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fami…

张浦专业做网站it从零开始学大概要学多久

1.查看运行内存 a.Free 快速查看内存的方法&#xff0c;也是经常使用的命令&#xff0c; -h 更人性化的显示内存的单元 -m 以M的形式显示 b.Top Top命令提供了实时性的运行中的程序的资源使用统计。可以根据内存的使用和大小来进行排序。 如上所示&#xff0c;top命令可以看…

【光照】Unity[光照烘焙]的原理与具体流程

Unity URP光照烘焙系统通过预计算全局光照(GI)将静态光源效果存储在光照贴图中,运行时直接采样以提升性能。支持实时、烘焙和混合三种模式,其中混合模式结合烘焙与实时计算优势。核心技术基于辐射度算法和光子映射,…