当前位置: 首页 > 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.rkmt.cn/news/21623.html

相关文章:

  • zerotier自建planet内网穿透详细配置教程 - IT苦行僧
  • legit torrents, legit trackers
  • python 数学计算 32位精度
  • 2025 年床上用品厂家最新推荐排行榜:从老牌实力到新锐创新的品质之选,涵盖批发与婚嫁选购指南
  • 现代C++对象工厂模式实现解析
  • 2025 年射线防护服生产厂家最新推荐排行榜:覆盖 X 射线 / 医用 / 中子射线防护服及防护裙、防护屏等品类,为医疗安检领域精选优质品牌
  • 在 VS Code 中集成 LaTeX 环境并创建第一个文档
  • Ai元人文:思想的归乡——从悟空之眼到未来哪吒
  • C语言的学习——梦开始的地方
  • linux基础—基线加固
  • 池化
  • 深入解析:【Coze】【视频】TK动画视频工作流
  • java学习2小时教程-【小细节】
  • 2025年太阳能板购买全攻略:推荐、选择与性价比分析
  • C 语言 - 操作文件函数全解析
  • 2025年麻辣王子全面评测:口味、价格与购买全攻略
  • 2025 年乡村波形护栏厂家最新推荐排行榜:聚焦优质企业,助力乡村道路安全建设选型参考道路/高速/乡村道路/乡村公路波形护栏板厂家推荐
  • 员工签到微信小程序系统:企业考勤管理的高效解决方案
  • powershell上移文件夹下的所有文件
  • 2025 年永磁电机厂家最新推荐排行榜:聚焦高效节能电机品牌,助力采购者精准选优质产品直流/无刷/风机/节能/高效永磁电机厂家推荐
  • Prometheus源码专题【左扬精讲】—— 监控系统 Prometheus 3.4.0 源码解析:recording rule
  • 校准计算器
  • 2025 年国内冷却塔生产厂家最新推荐排行榜:聚焦节能优势与多行业适配性的优质企业精选工业/横流/逆流/全钢/圆型/方形冷却塔厂家推荐
  • 2025 冷水机组厂家最新推荐排行榜:聚焦节能技术与客户口碑,精选国产实力品牌解析
  • Perforce:无法删除Stream Depot怎么处理
  • 2025 加工中心小程序最新推荐排行榜:涵盖五轴 / 卧式 / 立式机型,揭秘实力品牌核心优势
  • 植物大战僵尸杂交版下载安装教程:PC/安卓/iOS 全平台保姆级攻略【2025最新版】
  • 一文讲通zk-SNARK 跨链证明的核心原理
  • C语言restrict关键字
  • 企业搜索与智能工作流集成技术解析