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

【C++11】新特性 - 右值引用详解

文章目录

    • STD容器使用右值引用场景
      • 移动语义在容器中的使用主要体现在两个方面:移动构造函数和移动赋值运算符。
        • 移动语义只对右值有效,对左值无效原因

STD容器使用右值引用场景

移动语义在容器中的使用主要体现在两个方面:移动构造函数和移动赋值运算符。

  1. 移动构造函数:容器在插入元素时,通常需要进行内存分配和对象构造操作。如果元素类型具有移动构造函数,容器就可以使用移动构造函数来构造元素,避免不必要的拷贝和销毁操作,提高程序的性能和效率。

例如,下面的代码中,使用了移动构造函数来构造 std::vector 容器中的元素:

#include <iostream>
#include <vector>
#include <string>int main() {std::vector<std::string> v;std::string s = "hello";v.push_back(std::move(s)); // 使用移动构造函数构造元素std::cout << s << std::endl; // 输出空字符串return 0;
}

在这个示例中,我们定义了一个 std::vector 容器和一个字符串对象 s,并使用 push_back 函数将 s 移动到容器中。由于使用了移动构造函数,s 的资源所有权被转移到容器中,s 变成了一个空字符串。

  1. 移动赋值运算符:容器在进行元素赋值时,通常需要进行对象销毁和对象构造操作。如果元素类型具有移动赋值运算符,容器就可以使用移动赋值运算符来赋值元素,避免不必要的拷贝和销毁操作,提高程序的性能和效率。

例如,下面的代码中,使用了移动赋值运算符来赋值 std::vector 容器中的元素:

#include <iostream>
#include <vector>
#include <string>int main() {std::vector<std::string> v;std::string s1 = "hello";std::string s2 = "world";v.push_back(s1);v[0] = std::move(s2); // 使用移动赋值运算符赋值元素std::cout << s2 << std::endl; // 输出空字符串return 0;
}

在这个示例中,我们定义了一个 std::vector 容器和两个字符串对象 s1s2,并使用 push_back 函数将 s1 插入到容器中。然后,我们使用移动赋值运算符将 s2 赋值给容器中的元素。由于使用了移动赋值运算符,s2 的资源所有权被转移到容器中,s2 变成了一个空字符串。

需要注意的是,移动语义只对右值有效,对左值无效。因此,在使用移动语义时,需要注意对象的值类别。

移动语义只对右值有效,对左值无效原因

移动语义的本质是将一个对象的资源所有权从一个对象转移到另一个对象,避免不必要的复制和销毁操作,提高程序的性能和效率。对于右值对象,由于其不再被使用,因此可以将其资源所有权转移到另一个对象,避免了不必要的拷贝和销毁操作。

而对于左值对象,由于其可能还会被使用,因此不能将其资源所有权转移到另一个对象,否则会导致程序出错。例如,如果将一个左值对象的资源所有权转移到另一个对象,那么原对象就不能再被使用,这可能会导致程序出现未定义行为。

实例:
当一个对象是左值时,它通常是一个具有名称的变量或对象,它在程序中可能还会被使用。例如:

std::string s1 = "hello";
std::string s2 = s1; // 拷贝构造函数,将 s1 的值拷贝给 s2

在这个示例中,s1 是一个左值对象,它是一个具有名称的字符串变量。当我们将 s1 的值赋给 s2 时,会调用拷贝构造函数,将 s1 的值拷贝给 s2,这是因为 s1 是一个左值对象,不能将其资源所有权转移到另一个对象。 若转移了所有权,

而当一个对象是右值时,它通常是一个临时对象或表达式的结果,它在程序中不再被使用。例如:

std::string s1 = "hello";
std::string s2 = std::move(s1);  // 移动构造函数,将 s1 的值转移到 s2

在这个示例中,s1 是一个右值对象,它是一个临时对象或表达式的结果。当我们将 s1 的值转移到 s2 时,会调用移动构造函数,将 s1 的值转移到 s2,这是因为 s1 是一个右值对象,可以将其资源所有权转移到另一个对象。由于 s1 不再被使用,因此可以将其资源所有权转移到 s2,避免了不必要的拷贝和销毁操作。

因此,移动语义只对右值对象有效,对左值对象无效。在使用移动语义时,需要注意对象的值类别,避免出现不必要的错误和问题。

相关文章:

【C++11】新特性 - 右值引用详解

文章目录STD容器使用右值引用场景移动语义在容器中的使用主要体现在两个方面&#xff1a;移动构造函数和移动赋值运算符。移动语义只对右值有效&#xff0c;对左值无效原因STD容器使用右值引用场景 移动语义在容器中的使用主要体现在两个方面&#xff1a;移动构造函数和移动赋…...

C++学习笔记

C学习笔记函数一般有返回值&#xff0c;构造函数有没有返回值&#xff1f;有返回值&#xff0c;返回一个对象&#xff0c;确定所以没写&#xff1b;在头文件中&#xff0c;防卫式声明&#xff0c;#ifndef…#define … #endif;pass by value或者 reference&#xff0c;传值是整包…...

项目1实现login登录功能方案设计第三版

需求优化点:MySQL表常用功能模块实现方案index页面home页面需求 实现一个登录功能 实现的功能 注册(邮箱注册)登录(邮箱密码)重置密码查看操作记录(登录, 注册, 重置密码, 登出. 都算操作)登出在第2版的基础上进行优化:\ 优化点: VerificationCode(验证码储存库): 增加时间字段…...

Node【七】初识Express框架

文章目录&#x1f31f;前言&#x1f31f;Express框架&#x1f31f;1.什么是框架&#x1f31f;2.express安装&#x1f31f;3.创建web服务基本遵循之前的四个步骤&#xff1a;&#x1f31f;4.路由&#x1f31f; 由 &#xff1a;请求方式请求路径&#xff08;1&#xff09;get发送…...

Android 高通Camera2 Camera Device Close

1、很多人看到这个日志第一感觉可能觉得哪里没有合理释放&#xff0c;于是带着这个思路去进行百度探索 2、一开始我去寻找 ImageReader.OnImageAvailableListener 这个问题 var afterBitmap: Bitmap? null/**监听拍照的图片 */private val imageAvailableListener ImageRead…...

TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5

原文&#xff1a;Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的…...

4、浅谈Makefile文件及其简单的使用知识

文章目录1、什么是Makefile&#xff1f;&#xff08;1&#xff09;makefile关系到了整个工程的编译规则。&#xff08;2&#xff09;makefile带来的好处就是——“自动化编译”&#xff08;3&#xff09;make是一个命令工具&#xff0c;是一个解释makefile中指令的命令工具2、为…...

5G/V2X赛道「重启」

在提升高阶智能驾驶安全性和感知冗余能力的道路上&#xff0c;除了激光雷达、高精度地图及定位&#xff0c;还有一项技术可能即将掀起一场新的风暴。 就在今年3月&#xff0c;作为全球通信领域的年度风向标 — 2023世界移动通信大会&#xff08;MWC&#xff09;上&#xff0c;…...

pytorch进阶学习(四):使用不同分类模型进行数据训练(alexnet、resnet、vgg等)

课程资源&#xff1a;5、帮各位写好了十多个分类模型&#xff0c;直接运行即可【小学生都会的Pytorch】_哔哩哔哩_bilibili 目录 一、项目介绍 1. 数据集准备 2. 运行CreateDataset.py 3. 运行TrainModal.py 4. 如何切换显卡型号 二、代码 1. CreateDataset.py 2.Train…...

Java面向对象高级【注解和反射】

目录 注解 什么是注解&#xff1f; 自定义注解 元注解 反射 什么是反射 静态语言和动态语言 动态语言 静态语言 对比 Class类 Java内存分析 类加载过程 类加载器 获取运行时类的完整结构 通过Class对象实例化对象 1.调用Class对象的newInstance 2.Constructor…...

Pytorch基础 - 4. torch.expand() 和 torch.repeat()

目录 1. torch.expand(*sizes) 2. torch.repeat(*sizes) 3. 两者内存占用的区别 在PyTorch中有两个函数可以用来扩展某一维度的张量&#xff0c;即 torch.expand() 和 torch.repeat() 1. torch.expand(*sizes) 【含义】将输入张量在大小为1的维度上进行拓展&#xff0c;…...

《LeetCode》——LeetCode刷题日记

本期&#xff0c;将给大家带来的是关于 LeetCode 的关于二叉树的题目讲解。 目录 &#xff08;一&#xff09;606. 根据二叉树创建字符串 &#x1f4a5;题意分析 &#x1f4a5;解题思路 &#xff08;二&#xff09;102. 二叉树的层序遍历 &#x1f4a5;题意分析 &#…...

mysql数据库审计(1)

1.数据库审计工具介绍及选择 1.1. 数据库审计工具介绍 MySQL 分支的审计功能包含在企业版中&#xff0c;社区版可以使用其他分支提供的工具。目前已知的审计工具&#xff0c;社区版本有 Percona 的 Percona Server Audit Log 、MariaDB 的 MariaDB Audit Plugin 和 McAfee 的…...

Kafka---kafka概述和kafka基础架构

kafka概述和kafka基础架构 文章目录kafka概述和kafka基础架构Kafka定义消息队列传统消息队列应用场景缓存/消峰解耦异步通信消息队列的两种模式点对点模式发布/订阅模式kafka基础架构producerConsumerConsumer Group&#xff08;CG&#xff09;BrokerTopicPartitionReplicaLead…...

《JavaEE初阶》多线程基础

《JavaEE初阶》多线程基础 文章目录《JavaEE初阶》多线程基础前言:多线程的概念简单创建线程并运行:简述Thread中run方法与start方法的区别创建线程的几种方法:探讨串行执行与并行执行的执行时间多线程的使用场景:Thread类简单介绍:构造方法:获取线程的常见属性:线程的常用方法…...

技术分享 | OMS 初识

作者&#xff1a;高鹏 DBA&#xff0c;负责项目日常问题排查&#xff0c;广告位长期出租 。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本文主要贡献者&#xff1a;进行OMS源码分析的…...

【Elastic (ELK) Stack 实战教程】10、ELK 架构升级-引入消息队列 Redis、Kafka

目录 一、ELK 架构面临的问题 1.1 耦合度过高 1.2 性能瓶颈 二、ELK 对接 Redis 实践 2.1 配置 Redis 2.1.1 安装 Redis 2.1.2 配置 Redis 2.1.3 启动 Redis 2.2 配置 Filebeat 2.3 配置 Logstash 2.4 数据消费 2.5 配置 kibana 三、消息队列基本概述 3.1 什么是…...

优先、双端队列-我的基础算法刷题之路(八)

本篇博客旨在整理记录自已对优先队列、双端队列的一些总结&#xff0c;以及刷题的解题思路&#xff0c;同时希望可给小伙伴一些帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误之处&#xff0c;希望小伙伴们可以在评论区指出来&#xff0c;共勉 &…...

Python3 os.symlink() 方法、Python 质数判断

Python3 os.symlink() 方法 概述 os.symlink() 方法用于创建一个软链接。 语法 symlink()方法语法格式如下&#xff1a; os.symlink(src, dst)参数 src -- 源地址。 dst -- 目标地址。 返回值 该方法没有返回值。 实例 以下实例演示了 symlink() 方法的使用&#xff1…...

P1972 [SDOI2009] HH的项链

[SDOI2009] HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运&#xff0c;所以每次散步完后&#xff0c;他都会随意取出一段贝壳&#xff0c;思考它们所表达的含义。HH 不断地收集新的贝壳&#xff0c;因此&#xff0c;他的项链变得越来…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...