移动语义

news/2024/9/18 20:41:59/文章来源:https://www.cnblogs.com/niumachen/p/18419295

在 C++ 中,"移动版本" 是指使用了移动构造函数或移动赋值运算符的对象构造过程。这种过程可以显著减少资源的复制开销。

移动语义简介

移动语义允许将资源(如动态分配的内存)从一个对象转移到另一个对象,而不是复制这些资源。它通过以下方式实现:

  • 移动构造函数:用于创建一个新对象,并将资源从一个已有对象(源对象)转移到新对象(目标对象)。
  • 移动赋值运算符:用于将一个已有对象的资源转移到另一个已有对象,并清理源对象的资源。

移动操作的堆栈和堆变化

  1. 移动构造函数

    • 堆(Heap)

      • 在移动构造函数中,源对象的资源(如动态内存)会被转移到新对象。这通常会涉及从堆中获取资源指针并将其设置到新对象中。源对象的资源指针会被设置为 nullptr 或其他默认值,以避免重复释放。
      • 如果目标对象的堆内存已经分配,它可能需要调整大小以适应新资源。否则,目标对象会在堆上分配新的内存。
    • 栈(Stack)

      • 移动构造函数的参数(即源对象)是栈上的临时对象。在构造过程中,这些参数的生命周期只在函数调用期间。源对象的资源会被转移到目标对象,源对象在构造函数执行后仍然存在于栈上,但其资源状态可能被修改。
    • 示例

      std::vector<std::string> vec1;
      vec1.push_back("Hello"); // 使用 push_back 进行复制
      std::vector<std::string> vec2 = std::move(vec1); // 使用移动构造函数
      

      在这个例子中,vec2 使用移动构造函数从 vec1 迁移资源,vec1 变为空(或状态未定义)。

  2. 移动赋值运算符

    • 堆(Heap)

      • 移动赋值运算符将资源从源对象转移到目标对象。如果目标对象已经持有资源,它可能会先释放旧资源,然后获取源对象的资源。源对象的资源会被转移(如设置为 nullptr)以避免重复释放。
    • 栈(Stack)

      • 源对象和目标对象在栈上作为函数参数传递。在赋值操作过程中,目标对象的状态会被修改,源对象的资源会被转移。
    • 示例

      std::vector<std::string> vec1;
      vec1.push_back("Hello");
      std::vector<std::string> vec2;
      vec2 = std::move(vec1); // 使用移动赋值运算符
      

      在这个例子中,vec2 接受了 vec1 的资源,vec1 变为空。

总结

  • :在移动构造函数和移动赋值运算符中,堆内存的变化包括资源的转移或重新分配。移动操作通常避免了不必要的复制,减少了资源分配和释放的开销。

  • :移动操作的参数(源对象)通常是在栈上。移动构造函数和移动赋值运算符只涉及对源对象和目标对象的栈上状态的修改,不涉及实际资源的复制。

通过理解移动语义可以编写更高效的 C++ 代码,减少不必要的资源复制和提高程序的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799524.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C----函数递归之反汇编

环境 win10 vc6.0 debug 代码 关于求阶层问题:n!=n(n-1)!;(n-1)! = (n-1)(n-2)! 例如5!=5(4)! 4!=43! 3!=32! 2!=21 函数递归的出口是1,所以函数递归最重要的条件是去寻找递归的出口 int fun(int i) {int sum = 0;if (i == 1){return 1;}else{sum = i*fun(i-1);}return sum …

地平线占用预测 FlashOcc 参考算法-V1.0

1.简介 3D Occupancy Networks 的基本思路是将三维空间划分成体素网格,并对每个网格进行各类感知任务的预测。目前以网格为中心的方法能够预测每个网格单元的占用率、语义类别、未来运动位移和实例信息。3D occupancy 可以对道路障碍物进行更细粒度的划分,同时获取更精确的占…

手脱upx

其实已经是大一下刚开始的事情了,补个档 手动脱壳の新年快乐 查壳,有壳,UPXX32dbg打开文件,查看初始断点点击PUSHAD跟进,CTRL+*设置EIP,开始F8步过,寻找ESP寄存器第一次单个变红的地址此时的内存窗口开始步过第一次步过就发现ESP单个变红,右键跟进内存窗口然后在第一个…

使用firemin降低火狐内存占用

这些年一直使用火狐浏览器,之前一直在AMD平台的机器使用,没有遇到过内存占用过大的问题(可能也与平台无关)。现在在Intel CPU的机器上使用,时间一久,内存就占用很大。试过Firefox/内存消耗严重里面的办法,效果不明显。也试过修改about:config里面的一些选项,也没有达到…

代码随想录算法 - 回溯算法1

题目1 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n = 4, k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2: 输入:n = 1, k = 1 输出:[[1]]提示:1 <= n <= 20 1 <= k…

错误

PID自己搭的时候,要注意积分模块的位置,搞不明白好久了,原来是我把积分模块的位置放错了。直接用增益模块不容易出错。

OSG开发笔记(三十):OSG加载动力学仿真K模型文件以及测试Demo

前言Osg需要打开模型文件,但是遇到显示动力学仿真的K模型文件,.k文件是一种描述材料属性的文件,比如密度、弹性模量等,该模型文件不是常规中间开放格式,无法直接支持,需要自定义解析并且重建三维模型。 Demo实际非常流程,因为视频转gif导致部分看起来不行:   交互流畅…

0918高数一千题,多元函数积分学

T17.第一型曲线积分空间形式 用斯托克斯公式化成第二型曲面积分 解第二型曲面积分,用高斯公式或者投影转换法,后者注意正负号,上正下负,前正后负 T18.换路径,但是x=1左半段不能化成lnx算 T19.求偏导就对对应字母求就行,不用对y导x T20.多元极值AC-B2>0A>0,极小 A<…

Dynamic Locomotion in the MIT Cheetah 3 Through Convex Model-Predictive Control

1. Swing Leg Control\(J_i \in R^{3*3}\) 是足端雅可比;\(\tau _{i,ff}\) 是前馈力矩 \(\Lambda \in R^{3*3}\)是操作空间惯性矩阵;\(a_{i,ref} \in R^{3*3}\)是机体坐标系下的参考加速度 q是关节角度;\(C_i \dot{q}_i + G_i\)是科里奥利力和重力 2. Ground Force Control …

多机训练时的环境变量

多机训练时的环境变量 通过设置环境变量配置分布式训练,仅仅是为了在交互式 Python 环境下,方便查看实验效果。如果不是学习、试验目的,而是生产需求,可以直接通过 oneflow.distributed.launch 启动分布式训练,该模块内部根据命令行参数,自动设置了必要的环境变量。 1)M…

[Java基础]Stream流

当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似。但是实际上,它们完全是不同的东西。 Java8 Stream 使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式…