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

c++11——移动语义的举例说明

目录

一、移动语义(进行资源的转移)

1.定义

2.实现方式

二、右值和右值引用

1.右值

2.右值引用(&&)

三、移动构造函数

四、移动赋值运算符

五、std::move() 函数

1.本质

2.强调


一、移动语义(进行资源的转移)

1.定义

是一种优化技术,核心是将资源的所有权从一个对象转移到另外一个对象,而不必进行代价高昂的深拷贝操作,避免不必要的内存分配和数据复制。

2.实现方式

通过右值引用和移动构造函数/移动赋值运算符实现。也就是说:

移动语义需要满足两个条件:

①转化为右值引用

②存在移动构造函数/移动赋值运算符。

二、右值和右值引用

1.右值

指表达式结束后就不再存在的临时对象。不能对右值取地址。

右值又分为:纯右值(字面常量)和将亡值。

2.右值引用(&&)

右值引用是对右值的引用,使用&&表示,允许捕获并操作临时象。

三、移动构造函数

移动构造函数允许对象在创建时接管另一个对象的资源。

以MyString类为例,解释移动构造函数:

①先将s1(左值)通过std::move()强制转换为右值引用;

②然后调用对象的移动构造函数,实现资源的转移。

四、移动赋值运算符

移动赋值运算符允许对象在赋值时接管另一个对象的资源。

(1)以MyString类为例,解释移动赋值运算符:

①先将s1(左值)通过std::move()强制转换为右值引用;

②然后调用对象的移动赋值运算符,将堆区中的资源移动给另外一个对象,实现资源的转移。

(2)从下图也可以发现:

采用深赋值的方式(s2=s1),需要先将原本的堆空间进行释放,释放后又需要在堆区中重新开辟一块内存,而采用移动赋值(s3=std::move(s1))可以减少对堆区的操作。

五、std::move() 函数

1.本质

是C++标准库中的一个工具,核心作用是将左值强制转换为右值引用。

本质是一个类型转换函数,无论参数原本是左值还是右值,都会被转换为右值引用

注意:std::move本身并不执行移动操作,移动操作发生在后续调用的移动构造函数或移动赋值运算符中。

2.强调

std::move()函数不能将const对象转换为右值引用。

原因:

如果对象本身是const,转化后类型变为const T&&(常量右值引用),而移动构造函数/赋值运算符需要修改源对象的状态,要求参数通常是非const右值引用。因此无法调用移动操作。

当对 const 对象使用 std::move 时,编译器会选择 拷贝构造函数 而非移动构造函数(拷贝构造函数可以接受 const T& 参数)。

http://www.lryc.cn/news/586099.html

相关文章:

  • 三维渲染中的抗锯齿技术
  • TinyBERT:知识蒸馏驱动的BERT压缩革命 | 模型小7倍、推理快9倍的轻量化引擎
  • 9.4 自定义SMC服务开发
  • STM32第二十一天定时器TIM
  • Windows环境下解决Matplotlib中文字体显示问题的详细指南
  • 人工智能之数学基础:多元逻辑回归算法的矩阵参数求导
  • Spring(四) 关于AOP的源码解析与思考
  • 【Flask】基础入门
  • Flutter、React Native、Uni-App 的比较与分析
  • 如何防范金融系统中的SQL注入攻击
  • 【LeetCode 热题 100】98. 验证二叉搜索树——(解法一)前序遍历
  • 初等行变换会改变矩阵的什么?不变改变矩阵的什么?求什么时需要初等行变换?求什么时不能初等行变换?
  • 【Go + Gin 实现「双 Token」管理员登录】
  • Linux/Ubuntu安装go
  • 客户资源被挖?营销方案泄露?企业经营信息保护避坑指南
  • Day 3·知识卡片|Python基础:print 函数还能这么玩?
  • 阿里开源AI大模型ThinkSound如何为视频配上灵魂之声
  • Windows X64环境下mysql5.6.51安装指南
  • SpringBootloggers未授权访问漏洞处理
  • 基于MCP的CI/CD流水线:自动化部署到云平台的实践
  • Unity VR手术模拟系统架构分析与数据流设计
  • JVM 中“对象存活判定方法”全面解析
  • 同步、异步、阻塞、非阻塞之间联系与区别
  • Windows符号链接解决vscode和pycharm占用C盘空间太大的问题
  • [论文阅读] 人工智能 + 软件工程 | AI助力软件可解释性:从用户评论到自动生成需求与解释
  • 利用scale实现分页按钮,鼠标经过按钮放大
  • 12.使用VGG网络进行Fashion-Mnist分类
  • 解决bash终端的路径名称乱码问题
  • java单例设计模式
  • pip国内镜像源一览