【C++】右值引用全面揭秘:解锁 C++11 的性能革命与移动语义奥秘!

文章目录

C++11 引入了右值引用,这是 C++ 语言的一个重要特性,其目的是为了提高程序的性能,尤其是在对象的传递和资源管理方面。与左值引用相比,右值引用解决了在传返回值时的不足,显著减少了不必要的拷贝,提高了效率。

右值和左值的基本概念

在 C++ 中,表达式的值可以分为左值和右值两种类型:

  • 左值:表示一个持久存在的对象或者内存位置,通常在赋值语句的左侧出现,并且具有可以取地址的特性。例如:变量、数组元素、解引用等都是左值。
//以下均是左值
//变量
int a = 3;
int* pa = &a;
const int b = a;
int* ptr = new int(3);

//解引用
*ptr = 4;

//数组元素
string str("abcdef");
str[0];
  • 右值:表示临时对象、字面量常量或者表达式的结果,通常只能出现在赋值语句的右侧,具有不可取地址的特性。右值是没有名称的、即将被销毁的对象。
int a = 4, b = 5;

//以下均是右值
100;
a + b;
fmin(x, y);
string("qwer");

左值引用和右值引用

引用本质上是给对象取别名,右值引用就是给右值取别名左值引用就是给左值取别名右值引用左值引用在语法形式上是类似的:

Type& ref = x;  //左值引用

Type&& rref = y;  //右值引用

可以看到,左值引用使用 &,而右值引用使用 &&

//左值
int a = 3;
int* pa = &a;
const int b = a;
int* ptr = new int(3);

//左值引用
int& ra = a;
int*& rpa = pa;
const int& rb = b;
int* rptr = ptr;
int a = 4, b = 5;
//右值
//100;
//a + b;
//fmin(x, y);
//string("qwer");

//右值引用
int&& rr1 = 100;
int&& rr2 = a + b;
int&& rr3 = fmin(a, b);
string&& rr4 = string("qwer");

对右值引用的理解:右值本质上是一种生命周期很短的对象(将亡值),而右值引用实际上是将该对象的地址保存,该对象就不会立即销毁,延长了生命周期。

一般而言,右值引用只能引用右值,左值引用只能引用左值,但在特殊情况下,右值引用可以引用左值,左值引用也可以引用右值。

  • 左值引用去引用右值:需要在前面加 const 修饰。
  • 右值引用去引用左值:需要对左值进行 move
//左值引用去引用右值,需要加const
const int& r1 = 10;
const string& r2 = string("abcd");

//右值引用求引用左值,需要对左值move
int x = 3;
int&& rr1 = move(x);
string str("1234");
string&& rr2 = move(str);

左值引用在特定条件下可以引用右值,这一点在前面其实也有所涉及,之前模拟实现容器(如 vector、list等)的 push_back 函数:void push_back (const T& x),加 const 是为了让 x 既能接收左值也能接收右值。

move 本质上就是强制类型转换,不会改变左值对象本身的属性。

template 
typename remove_reference::type&& move (T&& arg) noexcept;
{
    return static_cast::type&&>(arg)
}

右值引用的主要用途

在右值

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4603.html

(0)
LomuLomu
上一篇 2024 年 12 月 28 日
下一篇 2024 年 12 月 28 日

相关推荐

  • Python Cookbook(第3版)中文版-PDF免费下载

    Python Cookbook(第3版)中文版-PDF免费下载 适读人群 :Python程序开发人员、编程爱好者、在校大学生 电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍:https://item.jd.com/13897579.html Python图书升级版本,Python编程从入门到实践,涵盖Python3.3,包含大量实用…

    2024 年 12 月 30 日
    31200
  • Redis Java 集成到 Spring Boot

    # Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~ ## 📚 本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。 ![在这里插入图片描述](https://pic.it1024doc.com/csdn/202412/ca054e533844dc927c24e57c1713f…

    2024 年 12 月 27 日
    32700
  • Mysql连接报错排查解决记录

    Mysql连接报错排查解决记录 背景: “` 系统:uos server-1060e ​ 运行环境kvm虚拟机 ​ mysql版本:5.7.44, for Linux (x86_64) “` 问题现象: 宿主机重启后,kvm虚拟机内的mysql服务无法远程连接了。通过不同的客户端工具连接,报错现象分别如下: dbeaver-ce 工具连接报错: “` …

    2025 年 1 月 12 日
    46500
  • 微软开源!Office 文档轻松转 Markdown!

    大家好,我是 Java陈序员。 今天,给大家介绍一款微软开源的文档转 Markdown 工具。 关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。 项目介绍 MarkItDown —— 微软开源的 Python 工具,能够将多种常见的文件格式(如 PDF、PowerPoint、Word、Excel、图像、音频…

    2025 年 1 月 10 日
    34300
  • Java刷题训练第一期

    个人主页:手握风云 专栏:Java刷题训练营 1. 字符转ASCII码 问题描述:BoBo教KiKi字符常量或字符变量表示的字符在内存中以ASCII码形式存储。BoBo出了一个问题给KiKi,输入一个字符,输出该字符相应的ASCII码。 输入描述:一行,一个字符。 输出描述:一行,输出输入字符对应的ASCII码。 算法分析:在Java当中,没有针对字符的输入…

    2024 年 12 月 31 日
    35300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信