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

左值,右值和移动语义

左值、右值和移动语义

左值和右值

C++的表达式分为左值表达式和右值表达式,右值又分为纯右值将亡值

左值和右值的定义:

  • 指代非临时对象且不可移动的表达式被称为左值表达式;当对象被用左值时,被使用的是对象的身份(在内存中的位置)。
  • 指代非临时对象且可移动的表达式被称为将亡值表达式;当对象被用作将亡值时,被使用的是对象的值(内容)。
  • 指代临时对象且可移动的表达式被称为纯右值表达式;做纯右值时被使用的是对象的值

常见的左值:

  1. 赋值运算符的左侧运算对象为左值,得到的结果也是左值。
  2. 内置解引用运算符(*),下标运算符([]),迭代器解引用运算符,string和vector的下标运算符的求职结果都是左值。
  3. 内置类型和迭代器的递增递减运算符作用于左值运算对象。

常见的右值:

  1. 对一个左值运算对象取地址返回一个右值。
  2. 字面量(字符字面量除外,字符字面量在内存中有自己的地址)。

移动语义

我们在编写程序时经常会拷贝对象,被拷贝的对象体量大或是对象本身要求分配内存空间时会造成很大的开销,并且有时在拷贝后不需要先前的对象,这是对象拷贝就显得很没有必要了,由此在C++11中引入了对象移动。

右值引用和左值引用

对象移动具体是通过右值引(&&)用实现的,右值引用就是必须绑定到右值上的引用,与之相对的是左值引用(也称为常规引用)。

当使用拷贝构造或拷贝赋值时,会造成拷贝可开销:

String(const String& string)
{std::cout << "Copy\n";m_Size = string.m_Size;m_Data = new char[m_Size];memcpy(m_Data, string.m_Data, m_Size);
}

但若使用移动构造,则可避免这些开销:

String(String&& string)
{printf("Move\n");m_Size = string.m_Size;m_Data = string.m_Data;string.m_Data = nullptr;	//防止重复析构string.m_Size = 0;
}

使用移动赋值时要注意释放先前的空间和确保在赋值自身时不会丢失数据:

String& operator=(String&& string)
{printf("Move\n");if (this != &string) {	//确保在赋值自身时不会丢失数据delete[] m_Data;	//释放先前的空间m_Size = string.m_Size;m_Data = string.m_Data;string.m_Data = nullptr;	//防止重复析构string.m_Size = 0;}return *this;
}

但移动构造和移动赋值只能接收右值,如当把name中的函数复制到m_Name时,不会调用移动拷贝,因为name虽然是右值引用类型,但它因有变量名而不是临时对象,被判定成左值

Entity(String&& name):m_Name(name) {}

这时就要将其强转成右值,C++11提供了std::move函数将左值转为右值由此使用std::move即可调用到拷贝构造。

Entity(String&& name):m_Name(std::move(name)) {}
http://www.hskmm.com/?act=detail&tid=31625

相关文章:

  • 2025年千斤顶厂家最新权威推荐排行榜:液压千斤顶、机械千斤顶、电动千斤顶源头厂家综合实力深度解析
  • VKD104CR是永嘉微VINKA推出低功耗2路触摸芯片该芯片具有较高的集成度
  • Cookie如何设置HTTPOnly和Secure 以防止XSS跨站脚本攻击
  • STM32学习路线!600+讲课程!软硬件兼修:裸机+RTOS+LVGL+硬件设计+项目实战 (STM32多核心开发板)
  • zerotier自建planet内网穿透详细配置教程 - IT苦行僧
  • 【2025-10-11】适应变化
  • C语言的学习——常量
  • 会充电的CANoe,高效完成即插即充(PnC)智能充电功能测试
  • Bridge 2025超详细保姆级下载安装全教程(含软件下载)
  • legit torrents, legit trackers
  • 2025年锅炉厂家最新权威推荐榜:燃气采暖锅炉/电热水锅炉/生物质锅炉/真空热水锅炉/蒸汽发生器全品类深度解析
  • c语言之对齐函数代码示例
  • PyAutoGUI库自动化测试脚本工具模拟键盘鼠标操作
  • 什么是Barriers IO
  • 2025 年床上用品厂家最新推荐排行榜:从老牌实力到新锐创新的品质之选,涵盖批发与婚嫁选购指南
  • MySQL中NULL值的5个反直觉行为,扭到了吗?
  • 2025 年射线防护服生产厂家最新推荐排行榜:覆盖 X 射线 / 医用 / 中子射线防护服及防护裙、防护屏等品类,为医疗安检领域精选优质品牌
  • 2025 最新阳澄湖大闸蟹权威推荐排行榜,揭秘优质品牌的独特魅力大闸蟹蟹卡 / 大闸蟹礼盒 / 大闸蟹礼券 / 好蟹汇大闸蟹选择指南
  • 碳中和背景下的能源数字化:MyEMS 为企业提供精准碳管理方案
  • 在 VS Code 中集成 LaTeX 环境并创建第一个文档
  • 2025 年月子会所推荐:女王臻瑷专注母婴护理 10 年,西安口碑之选的高端母婴护理服务解析
  • Ai元人文:思想的归乡——从悟空之眼到未来哪吒
  • 国产测试用例管理工具市场格局解析:四大产品如何赋能企业数字化转型
  • 桌面预测类编写,桌面%雷达,信号预测%系统构建,基于python,tk,scikit-learn机器学习算法实现,桌面预支持向量机分类算法,CSV无数据库
  • C语言的学习——梦开始的地方
  • 学习 n8n 心得
  • 2025 年外呼系统公司推荐:重庆腾宇科技,外呼系统专业缔造者与行业服务典范
  • oop实验一
  • 池化
  • 在AI技术唾手可得的时代,挖掘直播工具新需求成为关键突破点