当前位置: 首页 > news >正文

c++右值引用和移动语义

1. 什么是右值?

  • 左值:有名字,可以找到它放在哪(能取地址的)。
    比如:
int a = 10;   // a 是左值
  • 右值:临时的、没名字的,用完就没了的东西。
    比如:
int b = a + 5;   // a+5 是个临时值,就是右值
int c = 100;     // 100 这个字面量也是右值

你可以理解为:
左值像“家里有户口的人”,长期住在内存里。
右值像“旅馆里住一晚的游客”,用完就要走。

2. 右值引用(T&&)是干嘛的?

右值引用就是专门“接住”这种临时对象的手段。
比如:

void foo(int&& x) {cout << x << endl;
}foo(10);   // 可以

这里 10 是个右值(临时的常量),普通引用 int& 接不住,但 int&& 可以。
所以右值引用的作用是:接管临时值,让它不至于马上消失,还能被高效利用。

3. 为什么需要右值引用?

主要是为了解决 效率问题,特别是“拷贝 vs. 移动”。
拷贝(慢)

string s1 = "hello world";
string s2 = s1;  // 拷贝,需要新建一份内存

移动(快)

string s1 = "hello world";
string s2 = std::move(s1);  // 移动,直接把资源“过户”,不用再拷贝

右值引用就是移动语义的基础。
就像二手房交易:

拷贝 = 再盖一栋一样的房子,成本高。

移动 = 直接把钥匙交给你,省事。

4. 用法直观举例

class MyVector {int* data;size_t size;
public:// 构造函数MyVector(size_t n): size(n) {data = new int[n];cout << "构造" << endl;}// 拷贝构造MyVector(const MyVector& other): size(other.size) {data = new int[size];memcpy(data, other.data, size * sizeof(int));cout << "拷贝构造" << endl;}// 移动构造(右值引用)MyVector(MyVector&& other): size(other.size), data(other.data) {other.data = nullptr;  // 交出资源cout << "移动构造" << endl;}
};

使用:

MyVector v1(100);
MyVector v2 = v1;          // 触发拷贝构造(慢)
MyVector v3 = MyVector(50); // 触发移动构造(快,直接“过户”)
http://www.rkmt.cn/news/6551.html

相关文章:

  • 彩笔运维勇闯机器学习--梯度下降法
  • 项目管理软件产业革命:从工具升级到生产力范式转移
  • 详细介绍:Linux--初识网络
  • lua程序调试方法
  • 提示词工程(Prompt Engineering)是不是“新时代的编程”?
  • python日志记录之logging模块
  • O - Color a Tree
  • 前 k 小问题期末考
  • lvm硬盘分区与不分区优缺点
  • 中电金信能碳虚拟电厂数智化平台破局“双碳”难题
  • milvus创建一个用户管理多个库
  • 为什么ceph新添加的硬盘会自动变为osd
  • OF SF CF ZF 的判断方式以及例子
  • 2025年30个CRM系统盘点:哪款CRM系统适合你的企业? - SaaS软件
  • TSN Qav测试实践
  • 燕千云ITR平台引领服务流管理革命,构建企业客户服务智慧生态
  • Gitee推出革命性MCP Server:AI深度参与开发全流程 开启智能协作新时代
  • 取证 - voasem
  • 【SPIE独立出版|连续多年EI稳定检索】第七届地球科学与遥感测绘国际学术会议(GRSM 2025)
  • Python psutil模块
  • AI赋能CRM:纷享销客智能图像提升终端运营效率
  • 【linux命令】网卡命令 ①
  • 一款基于 .NET 开源美观、功能丰富的串口调试工具
  • 麒麟系统中docker常用命令
  • 在Oracle中,如何彻底停止expdp进程?
  • 服务器文件同步工具大盘点
  • 基于Python+Vue开发的酒店客房预订管理系统源码+运行步骤
  • 解锁RAG高阶密码:自适应、多模态、个性化技术深度剖析
  • 软件逆向入门理论
  • P1115 最大子段和