真正理解std::move
std::move的作用只有一个,那就是把一个左值强制转换为右值,有了这个右值,右值允许的任何操作就可以实施了。比如:1. 这个右值可以赋给一个左值变量,2. 这个右值可以被一个右值引用来引用。
class A
{public:A(int n):m_size(n){m_ptr=new int[n];}int m_size;int* m_ptr;~A(){cout<<" Destructor is called m_ptr="<<m_ptr<<endl;delete[] m_ptr;m_ptr=nullptr;}A(A& a){cout<<" copy constructor is called"<<endl;m_size=a.m_size;m_ptr=new int[m_size];}A(A&& a) // move constructor{if(this!=&a){m_ptr=a.m_ptr;m_size=a.m_size;a.m_ptr=nullptr;}cout<<" move constructor is called"<<endl;}A& operator=( A&&r) // move assignment operator{if(this!=&r){delete[] m_ptr;m_ptr=r.m_ptr;m_size=r.m_size;cout<<" move assignment operator is called"<<endl;r.m_ptr=nullptr;}return *this;}
};
int main(int argc, char const *argv[])
{A a1(10); // a1 is a left valuecout<<"1---will use copy constructor below"<<endl;A a2=a1; //这是定义一个左值a2,并且用另一个左值a1来赋值,拷贝构造函数被调用cout<<"2---will use move constructor below"<<endl;A a3=move(a1); // 移动构造函数被调用,在移动构造函数中,a3的m_ptr变量直接指向a1的m_ptr指向的内存,// 这样,对象a3不需要重新分配内存,而是直接使用a1.m_ptr指向的内存。// 于是a1.m_ptr指向的内存就被移动走了,逻辑上,a1.m_ptr指向必须为空了。// 为啥多此一举呢,直接操作a1不就行了???????cout<<"a1.m_ptr=="<<a1.m_ptr<<" 显示被移走了"<<endl;//a1被move了之后,依然是个左值, so any operation appled to a left value will be applied to a1 as well.// 下面我们给a1重新赋值cout<<"3---will use move assignment operator below"<<endl;a1=A(40); // 右值赋给一个已经定义的左值,于是移动赋值运算符被调用cout<<"4-----旧的a1生命周期结束,这是旧的a1的析构函数被调用"<<endl;// till now, there are 3 objects alive, a1(A(40)),a2,a3, 在程序退出后,这3个对象需要销毁,// 于是析构函数被调用4次 cout<<"5--生命周期结束,销毁3个对象"<<endl; return 0;
}
执行结果如下,仔细看一下吧
下面我详细说明一个std::swap的代码实现原理。
// std::swap函数的实现
template<class T>
void swap(T &x, T& y)
{T temp = std::move(x);x = std::move(y);y = std::move(temp);
}
第一行代码:T temp = std::move(x); 调用类型T的移动构造函数,使得temp指向x的资源(包括temp的值等于x的值),这个时候x依然是个左值
第二行 代码:x = std::move(y); 让x指向y的资源(包括x等于y的值)
第三行代码:y = std::move(temp); 让y指向temp的资源(包括y等于temp的值,也就是最初的x的值)
执行结果如下:可以看到,执行swap函数后,a1和a2进行了交换。上面红色方框中的a1的值,与a2进行了交换。
在看一下swap函数内部的执行情况,黄色数字1,2,3,4
黄色数字1表示 执行T temp = std::move(x),这里移动构造函数被调用
黄色数字2表示 执行x = std::move(y);,这里移动赋值函数被调用
黄色数字3表示 执行y = std::move(temp),这里移动赋值函数被调用
黄色数字4表示函数退出的时候,临时变量temp需要销毁,于是析构函数被调用
执行结果的最后两个表示a1和a2被析构。
最后有几点需要说明:
1. std::move和移动构造函数、移动赋值运算符没有任何联系。
2.移动构造函数、移动赋值运算符的调用和一个右值赋值给一个左值的形式有关系。比如:
A a1(10);
A a3=move(a1)
上述情况在定义a3的同时,给赋一个右值,这时移动构造函数被触发。
如果是:
A a3(10);
a3=A(20);
这是一个右值被赋给一个已经创建成功的左值变量,很显然,这时移动赋值运算符被触发。
3. move也和右值引用没有任何联系,可以参考这篇博文:理解C++中的右值引用-CSDN博客
4. 一个左值被move之后,这个左值还能被使用吗?不能被使用,因为这个左值指向的资源可能都被“move”走了,比如:
A a1(10);
A a3=move(a1)
a1被move之后,它的指针已经为空指针了,所以操作a1,可能会得到不可预测的结果。但是a1可以被重新赋值,比如:
a1=A{100),之后a1就又是一个正常的左值了。
相关文章:
真正理解std::move
std::move的作用只有一个,那就是把一个左值强制转换为右值,有了这个右值,右值允许的任何操作就可以实施了。比如:1. 这个右值可以赋给一个左值变量,2. 这个右值可以被一个右值引用来引用。 class A {public:A(int n):…...
Vue3.5 企业级管理系统实战(三):页面布局及样式处理 (Scss UnoCSS )
本章主要是关于整体页面布局及样式处理,在进行这一章代码前,先将前两章中的示例代码部分删除(如Home.vue、About.vue、counter.ts、App.vue中引用等) 1 整体页面布局 页面整体布局构成了产品的框架基础,通常涵盖主导…...
Python3 【函数】项目实战:5 个新颖的学习案例
Python3 【函数】项目实战:5 个新颖的学习案例 本文包含5编程学习案例,具体项目如下: 简易聊天机器人待办事项提醒器密码生成器简易文本分析工具简易文件加密解密工具 项目 1:简易聊天机器人 功能描述: 实现一个简易…...
17.Word:李楠-学术期刊❗【29】
目录 题目 NO1.2.3.4.5 NO6.7.8 NO9.10.11 NO12.13.14.15 NO16 题目 NO1.2.3.4.5 另存为手动/F12Fn光标来到开头位置处→插入→封面→选择花丝→根据样例图片,对应位置填入对应文字 (手动调整即可)复制样式:开始→样式对话框→管理…...
基于GS(Gaussian Splatting)的机器人Sim2Real2Sim仿真平台
项目地址:RoboGSim 背景简介 已有的数据采集方法中,遥操作(下左)是数据质量高,但采集成本高、效率低下;传统仿真流程成本低(下右),但真实度(如纹理、物理&…...
基于Django的豆瓣影视剧推荐系统的设计与实现
【Django】基于Django的豆瓣影视剧推荐系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用了Python作为后端开发语言,采用Django作为后端架构,结…...
提升企业内部协作的在线知识库架构与实施策略
内容概要 在当前快速变化的商业环境中,企业对于提升内部协作效率的需求愈显迫切。在线知识库作为信息存储与共享的平台,成为了推动企业数字化转型的重要工具。本文将深入探讨如何有效打造与实施在线知识库,强调架构设计、知识资产分类管理及…...
Vuex中的getter和mutation有什么区别
在现代前端开发中,状态管理是一个不可忽视的话题,而Vuex作为Vue.js的官方状态管理库,在大型应用中扮演着至关重要的角色。当我们使用Vuex进行状态管理时,getter和mutation是两个重要的概念。虽然它们都是用来处理状态的࿰…...
springboot 动态线程池
在Spring Boot中,可以使用ThreadPoolTaskExecutor类来创建动态线程池。以下是一个示例: 首先,需要在配置文件中配置线程池的属性,例如最小线程数、最大线程数、线程存活时间等。可以在application.properties或application.yml中…...
Android - 通过Logcat Manager简单获取Android手机的Log
由于工作需要,经常需要获取Android手机的Log。 平常都是通过adb命令来获取,每次都要写命令。 偶然的一个机会,我从外网发现了一个工具 Logcat Manager,只需要通过简单的双击即可获取Android的Log,这里也分享一下。 目…...
qt-QtQuick笔记之常见项目类简要介绍
qt-QtQuick笔记之常见项目类简要介绍 code review! 文章目录 qt-QtQuick笔记之常见项目类简要介绍1.QQuickItem2.QQuickRectangle3.QQuickImage4.QQuickText5.QQuickBorderImage6.QQuickTextInput7.QQuickButton8.QQuickSwitch9.QQuickListView10.QQuickGridView11.QQuickPopu…...
C语言【基础篇】之流程控制——掌握三大结构的奥秘
流程控制 🚀前言🦜顺序结构💯 定义💯执行规则 🌟选择结构💯if语句💯switch语句💯case穿透规则 🤔循环结构💯for循环💯while循环💯do -…...
LeetCode100之全排列(46)--Java
1.问题描述 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案 示例1 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例2 输入:nums [0,1] 输出…...
html、js、css实现爱心效果
好的!我们可以进一步美化这个爱心效果,增加更多动态和视觉吸引力。以下是改进后的代码,包括以下功能: 1. 背景渐变:添加动态背景渐变效果。 2. 爱心阴影:为爱心添加阴影,使其更具立体感。 3. 随…...
记录 | 基于Docker Desktop的MaxKB安装
目录 前言一、MaxKBStep 1Step2 二、运行MaxKB更新时间 前言 参考文章:如何利用智谱全模态免费模型,生成大家都喜欢的图、文、视并茂的文章! MaxKB的Github下载地址 参考视频:【2025最新MaxKB教程】10分钟学会一键部署本地私人专属…...
信息学奥赛一本通 2110:【例5.1】素数环
【题目链接】 ybt 2110:【例5.1】素数环 【题目考点】 1. 深搜回溯 2. 质数 【解题思路】 1~n的数字构成一个环,要求相邻数字加和必须是质数。 该题最终输出的是一个序列,只不过逻辑上序列最后一个数字的下一个数字就是序列的第一个数字…...
5.1.4 软件工具+开发环境
文章目录 软件工具软件开发环境 软件工具 软件工具是辅助软件工程实施的软件,也叫CASE工具。软件工具可分为支持软件开发过程的工具、软件维护工具、软件管理工具3类。 支持软件开发过程的工具 需求分析工具:从需求定义制定出功能规范,描述软…...
嵌入式知识点总结 Linux驱动 (四)-中断-软硬中断-上下半部-中断响应
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.硬中断,软中断是什么?有什么区别? 2.中断为什么要区分上半部和下半部? 3.中断下半部一般如何实现? 4.linux中断的…...
【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
一、使用pytorch框架实现逻辑回归 1. 数据部分: 首先自定义了一个简单的数据集,特征 X 是 100 个随机样本,每个样本一个特征,目标值 y 基于线性关系并添加了噪声。将 numpy 数组转换为 PyTorch 张量,方便后续在模型中…...
21款炫酷烟花合集
系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码:Python动漫烟花(完整代码) Python烟花② 完整…...
【8】思科IOS AP升级操作
1.概述 本文主要针对思科AP的升级操作进行记录,思科的AP目前主要分为IOS和COS AP,IOS AP是我们常见的AP3502/AP1602/AP2702等等型号的AP,而COS AP是AP2802/3802等型号的AP。当然这里所指的都是一些室内AP,如AP1572等室外AP也同样适用。本文先对IOS AP的升级操作进行总结,…...
Continuous Batching 连续批处理
原始论文题目: Continuous Batching — ORCA: a distributed serving system for Transformer-based generative models 关键词: Continuous Batching, iteration-level scheduling, selective batching 1.迭代级调度(iteration-level scheduling) Orca系统又由几个关键…...
如何解决小尺寸图像分割中的样本不均衡问题
1. 生成对抗数据增强(Copy-Paste Augmentation) 原理:将稀有目标的像素块复制粘贴到其他图像中,低成本生成平衡数据。 适用场景:小目标(如车辆、船只)或极端稀疏类别(如灾害损毁区域…...
obsidian插件——Metadata Hider
原本是要找导出图片时显示属性的插件,奈何还没找到,反而找到了可以隐藏属性的插件。唉,人生不如意,十之八九。 说一下功能: 这个插件可以把obsidian的文档属性放在右侧显示,或者决定只显示具体几项属性&a…...
Ubuntu 20.04 Realtek 8852无线网卡驱动
个人博客地址:Ubuntu 20.04 Realtek 8852无线网卡驱动 | 一张假钞的真实世界 sudo apt-get update sudo apt-get install make gcc linux-headers-$(uname -r) build-essential gitgit clone https://github.com/lwfinger/rtw89.git -b v5 cd rtw89 && mak…...
神经网络|(六)概率论基础知识-全概率公式
【1】引言 在前序学习进程中,我们已经对条件概率做了分析,知晓了古典概型下,求某个条件下某事件发生的概率,应该是计算促成条件发生的事件和要求的某事件都发生的综合概率。 再次回忆一下条件概率的定义: 条件概率就…...
LLM推理优化:数据、模型与系统级策略
标题:“LLM推理优化:数据、模型与系统级策略” 文章信息摘要: 文章探讨了大语言模型(LLM)推理优化的多层次策略,包括数据级、模型级和系统级优化。数据级优化通过输入压缩和提示工程提升效率;模…...
人工智能在医疗领域的应用有哪些?
人工智能在医疗领域的应用十分广泛,涵盖了诊断、治疗、药物研发等多个环节,以下是一些主要的应用: 医疗影像诊断 疾病识别:通过分析 X 光、CT、MRI 等影像,人工智能算法能够识别出肿瘤、结节、骨折等病变,…...
K8S极简教程(4小时快速学会)
1. K8S 概览 1.1 K8S 是什么 K8S官网文档:https://kubernetes.io/zh/docs/home/ 1.2 K8S核心特性 服务发现与负载均衡:无需修改你的应用程序即可使用陌生的服务发现机制。存储编排:自动挂载所选存储系统,包括本地存储。Secret和…...
大数据学习之SCALA分布式语言三
7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…...
[免费]基于Python的Django博客系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的基于Python的Django博客系统,分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展,信息的传播与…...
ES设置证书和创建用户,kibana连接es
1、启动好es 2、进入es容器 docker exec -it es /bin/bash 3、生成ca证书 ./bin/elasticsearch-certutil ca 注:两个红方框位置直接回车 4、生成cert证书 ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 注:前两个红框直接回车&am…...
“大模型横扫千军”背后的大数据挖掘--浅谈MapReduce
文章目录 O 背景知识1 数据挖掘2 邦费罗尼原则3 TF.IDF4 哈希函数5 分布式文件系统 一、MapReduce基本介绍1. Map 任务2. 按键分组3. Reduce 任务4. 节点失效处理5.小测验:在一个大型语料库上有100个map任务和若干reduce任务: 二、基于MapReduce的基本运…...
< OS 有关 > 阿里云 几个小时前 使用密钥替换 SSH 密码认证后, 发现主机正在被“攻击” 分析与应对
信息来源: 文件:/var/log/auth.log 因为在 sshd_config 配置文件中,已经定义 LogLevel INFO 部分内容: 2025-01-27T18:18:55.68272708:00 jpn sshd[15891]: Received disconnect from 45.194.37.171 port 58954:11: Bye Bye […...
【C++高并发服务器WebServer】-7:共享内存
本文目录 一、共享内存1.1 shmget函数1.2 shmat1.3 shmdt1.4 shmctl1.5 ftok1.6 共享内存和内存映射的关联1.7 小demo 二、共享内存操作命令 一、共享内存 共享内存允许两个或者多个进程共享物理内存的同一块区域(通常被称为段)。由于一个共享内存段会称…...
Python中容器类型的数据(下)
集合 集合 (set) 是一种可迭代的、无序的、不能包含重复元素的容器类型的数据。 Python中的集合是一种重要的数据结构,以下为你详细介绍: 定义与特点 无序性:集合中的元素没有固定顺序, {1, 2, 3} 和 {3, 2, 1} 在Python中是同一…...
JavaScript系列(45)--响应式编程实现详解
JavaScript响应式编程实现详解 🔄 今天,让我们深入探讨JavaScript的响应式编程实现。响应式编程是一种基于数据流和变化传播的编程范式,它使我们能够以声明式的方式处理异步数据流。 响应式编程基础概念 🌟 💡 小知识…...
uniapp版本升级
1.样式 登录进到首页,弹出更新提示框,且不可以关闭,侧边返回直接退出! 有关代码: <uv-popup ref"popupUpdate" round"8" :close-on-click-overlay"false"><view style"…...
K8s运维管理平台 - KubeSphere 3.x 和4.x 使用分析:功能较强,UI美观
目录标题 Lic使用感受优点:优化点: 实操首页项目 | 应用负载 | 配置 | 定制资源定义存储监控告警集群设置 **KubeSphere 3.x** 和 **4.x**1. **架构变化**:2. **多集群管理**:3. **增强的 DevOps 功能**:4. **监控与日…...
使用Python Dotenv库管理环境变量
使用Python Dotenv库管理环境变量 在开发Python应用程序时,管理配置信息(如API密钥、数据库连接字符串等)是一个常见的需求。为了确保安全性和灵活性,通常不建议将这些敏感信息硬编码在代码中。这时,dotenv库就派上了…...
HTTP 配置与应用(不同网段)
想做一个自己学习的有关的csdn账号,努力奋斗......会更新我计算机网络实验课程的所有内容,还有其他的学习知识^_^,为自己巩固一下所学知识,下次更新校园网设计。 我是一个萌新小白,有误地方请大家指正,谢谢…...
异或哈希总结
例题 例题1https://codeforces.com/problemset/problem/1175/Fhttps://codeforces.com/problemset/problem/1175/F 例题2https://codeforces.com/contest/2014/problem/Hhttps://codeforces.com/contest/2014/problem/H例题4https://codeforces.com/contest/1418/problem/Ght…...
我的2024年总结
趁着摸鱼赶紧写一下吧 去年目标review 还是将去年的目标完成了一些 【接纳不完美,多拍照片】 这个还是部分做到了,今年和一些朋友们见面时都注意拍照留记录了,不过还可以继续加强,因为外貌上发生了重大变化,下面细说…...
简易CPU设计入门:控制总线的剩余信号(二)
项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 CSDN文章:下载本项目代码 上述链接为本项目…...
软件开发中的密码学(国密算法)
1.软件行业中的加解密 在软件行业中,加解密技术广泛应用于数据保护、通信安全、身份验证等多个领域。加密(Encryption)是将明文数据转换为密文的过程,而解密(Decryption)则是将密文恢复为明文的过程。以下…...
ArcGIS10.2 许可License点击始终启动无响应的解决办法及正常启动的前提
1、问题描述 在ArcGIS License Administrator中,手动点击“启动”无响应;且在计算机管理-服务中,无ArcGIS License 或者License的启动、停止、禁止等均为灰色,无法操作。 2、解决方法 ①通过cmd对service.txt进行手动服务的启动…...
rust feature h和 workspace相关知识 (十一)
feature 相关作用和描述 在 Rust 中,features(特性) 是一种控制可选功能和依赖的机制。它允许你在编译时根据不同的需求启用或禁用某些功能,优化构建,甚至改变代码的行为。Rust 的特性使得你可以轻松地为库提供不同的…...
动手学深度学习-卷积神经网络-3填充和步幅
目录 填充 步幅 小结 在上一节的例子(下图) 中,输入的高度和宽度都为3,卷积核的高度和宽度都为2,生成的输出表征的维数为22。 正如我们在 上一节中所概括的那样,假设输入形状为nhnw,卷积核形…...
最长递增——蓝桥杯
1.题目描述 在数列 a1,a2,⋯,an 中,如果ai<ai1<ai2<⋯<aj,则称 ai 至 aj 为一段递增序列,长度为 j−i1。 定一个数列,请问数列中最长的递增序列有多长。 输入描述 输入的第一行包含一个整数 n。…...
DeepSeek R1 对比 AlphaGo,Zero 的思考过程
作者:真中合欢 原文:https://zhuanlan.zhihu.com/p/19897045280 等了好久,终于等来R1的论文,我在当天晚上第一时间拜读。整篇论文的实验和理论给我一种简洁的优雅,和DeepSeek-V3那篇论文的感觉完全不同。读论文的过程中…...