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

跟我学C++中级篇——处理对象的复制

一、对象的传递

在应用程序中,经常会遇到不同线程或不同模块间需要进行对象的传递,本来传递不是什么多大的事。但问题是,如果对象的值大到一定的程度后,传递不是问题可对象值的处理反而成了问题了。举一个现实世界的例子,用人传递物品,如果是一个水果,一个手机之类的简单东西,那么几乎不会耗费什么精力和时间。但如果让人代传一吨水果,一车手机怎么办?传递本身不是主要的了,主要的是货物如何进行运输了。
而在计算机世界中,对象的传递也是如此,大对象的处理就成为了一个主要的问题。

二、类对象的拷贝

几乎在所有的学习C++编程的开发者中,都接触过类的拷贝过程中的深拷贝和浅拷贝的问题。这也是在面试过程中,让面试者编写string类的一个面试点。而通过这个面试点,则可引出类的拷贝问题,包括拷贝构造函数、拷贝赋值函数,当然C++11后也包括移动构造函数、移动构造函数和移动赋值函数。这也就是前面的文章中提到的“三五法则”(本文不谈论拷贝函数等的具体实现,也不对三五法则进行展开分析,有兴趣的可以参看前面的相关内容。)。
对象的拷贝,其实就是如何正确处理对象内容特别是数据的拷贝,如果涉及到对象内部的对象变量则也可以如此认为。

三、内存的拷贝

在参数的传递过程中,除了有对象的拷贝,还有数组等的传递,如果把它们都当成对象的话,则可以统一到对象的拷贝或者说大对象的拷贝。大对象的拷贝,本质其实就是内存的拷贝,无论是在堆上还是栈上,原理基本都是一样的,所谓大对象其实就是内存占用的多罢了。
既然明白了对象和内存拷贝最终其实是一致的后,就会明白了如何对对象传递的优化。

四、常见的优化手段

对象或内存的优化手段常见的有如下几种手段或者说方法:
1、使用C++标准中的方法
1)引用或指针传递:这种比较简单,也是开发者经常使用的,不过需要注意与const的配合使用
2)使用移动语义:这个只能是在C++11标准后,其它倒没什么
2、借助编译器的优化
1)返回值优化(RVO或NRVO):这个在前面分析过,大家也可以查看相关的资料
2)尾调优化(TCO):这个才刚刚分析过,有兴趣可以看一下
3、使用库或框架
1)使用类似于STL中的std::swap方法
2) 使用类似于对象池或内存池的方法或手段
4、使用一些策略
比较常见的就是COW,写时复制、零拷贝等。前面反复分析过,此处不再展开。
上面的手段后,有的是可以避免内存的复制的方法,有的则是一种优化的策略,特别是对COW这种,其实就是一种平衡的手段。另外,零拷贝则是一种优化的抽象,具体到不同的具体场景可能是有所不同的。

五、总结

本文可以说是对前面的一系列的相关文章的总结,如果只是看这一篇,可能有务虚的感觉。大家可以把本文做为一篇阅读的目录或大纲,逐一展开去学习或分析即可。当然,不是每个开发者对这些内容都感兴趣,大家只要根据自己情况决定即可。

http://www.xdnf.cn/news/1882.html

相关文章:

  • Java实现加密(七)国密SM2算法的签名和验签(附商用密码检测相关国家标准/国密标准下载)
  • 深度解析 Java 排序中的 Null 值处理:Comparator.nullsLast 与 Comparator.nullsFirst 最佳实践
  • 酷狗音乐安卓版K歌功能与音效优化体验测评
  • 整合 CountVectorizer 和 TfidfVectorizer 绘制词云图
  • easyExcel导入导出convert
  • 算法训练营 Day1
  • 课程9. 机器翻译,Seq2Seq与Attention
  • BS客户端的单点登录
  • 贪心算法~~
  • 2022李宏毅老师机器学习课程笔记
  • 2025年第一季度159个CVE漏洞遭利用 28.3%在披露24小时内被攻击
  • day01_编程语言介绍丶Java语言概述丶开发环境搭建丶常用DOS命令
  • 数字人民币杠杆破局预付乱象 XBIT智能合约筑牢资金安全防线
  • IT人力外包定义-优势-服务流程介绍
  • 第1讲|R语言绘图体系总览(Base、ggplot2、ComplexHeatmap等)
  • 从零开始学Python游戏编程40-碰撞处理2
  • ElementUi的tabs样式太难修改,自定义tabs标签页
  • 26考研 | 王道 | 数据结构笔记博客总结
  • Java并发编程面试题:并发工具类(10题)
  • WebUI可视化:第6章:项目实战:智能问答系统开发
  • 区间和数量统计 之 前缀和+哈希表
  • Qt基础009(HTTP编程和QJSON)
  • Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互
  • AD盖白油(一面是板颜色,一面是白色丝印)
  • 数据库-子查询、关联查询 和 TCL 语言
  • 【HTTP/3:互联网通信的量子飞跃】
  • AI 编程工具:Augment Code
  • 影楼精修-手部青筋祛除算法解析
  • 2025年江西建筑安全员A证适合报考人群
  • 【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)