首页 > 其他分享 >移动语义

移动语义

时间:2024-09-18 20:34:44浏览次数:10  
标签:对象 语义 运算符 vec1 移动 资源 构造函数

在 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++ 代码,减少不必要的资源复制和提高程序的性能。

标签:对象,语义,运算符,vec1,移动,资源,构造函数
From: https://www.cnblogs.com/niumachen/p/18419295

相关文章

  • 天翼云、联通云、移动云,你如何看三大运营商的云?
    从最近三大运营商2024年中期财报来看,天翼云收入552亿元、移动云收入504亿元、联通云收入317亿元,一字排开,彰显出运营商在云计算领域雄厚的发展实力,也再次说明了,拥有好的渠道体系与资源,公有云及相关业务的开拓必然会成果显赫的。不过,对于任何一朵云来说,云计算事业的辉煌成就,离不开拥......
  • 【渗透测试】ATT&CK靶场一,phpmyadmin,域渗透,内网横向移动攻略
    前言VulnStack,作为红日安全团队匠心打造的知识平台,其独特优势在于全面模拟了国内企业的实际业务场景,涵盖了CMS、漏洞管理及域管理等核心要素。这一设计理念源于红日安全团队对ATT&CK红队评估设计模式的深刻理解和巧妙应用。靶场环境的构建与题目设计均围绕环境搭建、漏洞利用、内......
  • 高效数据移动指南 | 如何快速实现数据库 MySQL 到 MongoDB 的数据同步?
    在现代企业中,数据无处不在,贯穿于各个业务环节和系统之间。无论是跨系统的数据集成、多地域的数据协同,还是实时应用的数据同步,数据的一致性和及时性都至关重要。在数字化转型的过程中,如何确保不同系统、地域、设备之间的数据同步,成为了企业面临的重要挑战。本专题将基于实践经验,从......
  • .NET 开源工业级移动端仓库管理系统
    前言在工业生产中,定制化的软件对于每个环节都至关重要。对于仓库管理,推荐一款开源的仓库管理系统(WMS)解决方案。这款基于.NET框架开发的移动应用,提供了全面的仓库操作、订单处理、主数据管理、数据分析及个人信息设置等功能,是工业仓库管理的有利助手。项目介绍SmoWMS是一款基......
  • CAS-ViT:用于高效移动应用的卷积加法自注意力视觉Transformer
    近年来,VisionTransformer(ViT)在计算机视觉领域取得了巨大突破。然而ViT模型通常计算复杂度高,难以在资源受限的移动设备上部署。为了解决这个问题,研究人员提出了ConvolutionalAdditiveSelf-attentionVisionTransformers(CAS-ViT),这是一种轻量级的ViT变体,旨在在效率和性......
  • 移动设备上的大模型优化:MobileLLM
    人工智能咨询培训老师叶梓转载标明出处现有的大模型因为过于庞大难以直接部署在资源受限的移动设备上。针对这一问题,来自 Meta公司和PyTorch的研究团队提出了一种新的优化方法,旨在为移动设备设计高效的、参数少于十亿的高质量大模型,即MobileLLM。图1为小于10亿参数的......
  • WSL挂载U盘或移动硬盘
    创建挂载目录sudomkdir/mnt/e挂载U盘或者移动硬盘sudomount-tdrvfsE:/mnt/e卸载U盘或者移动硬盘sudoumount/mnt/e说明drvfs是WindowsSubsystemforLinux(WSL)中的一个虚拟文件系统,用于将Windows驱动器(如C:、D:、E:等)挂载到WSL的文件系统中......
  • 引入语义标签过滤:利用标签相似度增强检索
    引入语义标签过滤:利用标签相似度增强检索传统的标签搜索缺乏灵活性。如果我们要过滤恰好包含给定标签的样本,可能会出现这样的情况,特别是对于只包含几千个样本的数据库,可能没有任何(或只有少数)与我们的查询匹配的样本。两种搜索的不同之处在于搜索结果的稀缺性传统的标签搜......
  • 小李移动开发成长记 —— 大话小程序
    小李移动开发成长记——大话小程序做传统网站前端开发的同学初次接触小程序,会有许多困惑:为什么没有div,view是什么、怎么没有ajax,wx.request为什么是回调方式、预览怎么要用小程序开发者工具、APPID有什么用、安装npm包怎么还要构建、tabBar是什么、语法怎么和vue很像但是有......
  • QTreeView代理QStyledItemDelegate实现按钮的鼠标hover移动和点击响应
    1.需求描述QStyledItemDelegate实现按钮的点击和响应功能,鼠标移动到按钮上,也会显示tooltip提示信息2.实现方法(1)重写editorEvent函数,根据type类型触发不同的响应函数为了实现按钮的响应,需要重写QStyledItemDelegate类的editorEvent函数,并根据插入时设置进去的type类型,判断是......