C++11中出现了很多迷人的特性。例如智能指针实现高效的内存管理,std::bind和std::function函数封装器,以及lambda实现的函数对象语法糖,都是使我着迷的地方。

  而C++11最大的改动则是移动语义,考虑这么一个场景:将一个将亡对象A的内容拷贝给另一个对象B,然后A对象被析构释放内存,我们的程序使用B对象。这是经常发生的事情,调用函数传参或者函数返回值时最为常见。如果A和B对象占用的内存非常多,则这个操作会导致大量内存的拷贝。

  为什么我们不直接将对象A的名字改成B呢?这样就省去了拷贝内存和析构的时间,增加的只是重命名的时间,在对象所占内存巨大时(例如对象是一个高度为1000的平衡二叉树(std::map),每个节点又是一个庞大的自定义结构体)。

  是的,为了这个目的,C++作出了很多的努力,引用传参就能实现为对象取一个别名的作用,然而这一套别名系统必须保证原对象存在,如果原对象超出作用域被析构,则所有关于这个对象的别名都会立刻失效,这一个对象的持有者还是它自身,只是使用别名可以在对象存在期间引用它。

  想要改变持有者,则可以使用智能指针,多个指针同时持有一个对象,当最后一个指针析构时会将指向的对象析构,这使得对象可以被多个指针持有,这是智能指针与引用语法的一个区别,并且智能指针是靠库实现,而引用是靠语法支持。而智能指针有一个非常大的特点,它有权力析构对象,意味着它所指向的内容必须是堆区内容,而栈上的内容则靠出栈时自动析构释放内存,如果你的大体积的对象是放在栈上,则使用智能指针是不行的。

  移动语义的发明,就能解决这个问题,不管发生栈上或者堆上 大体积对象的拷贝,就可以使用移动语义,改变该对象的持有者,而不需要拷贝这块内存。还是最初 将亡值A拷贝到B的例子,依靠移动语义,拷贝时使B指向A的内容,然后A指向B的内容(也就是交换内容,注意这里的交换没有发生大内存拷贝,只是改变了指针的指向。)然后A对象释放,我们接着使用B对象,B对象的内容是A原来的内容,而A对象析构时将B对象原本要被覆盖的内容析构掉,完美。

  C++从引用语法、智能指针类、移动语义多个方面支持开发者减少内存的拷贝,发挥出C++的性能威力。在设计良好的情况下,不会出现大内存块的拷贝。

转载于:https://www.cnblogs.com/xjjsk/p/8952139.html

C++11如何减少内存拷贝次数相关推荐

  1. emplace_back减少内存拷贝和移动

    --------<深入应用C++11:代码优化与工程级应用>第2章使用C++11改进程序性能,本章将分别介绍右值引用相关的新特性.本节为大家介绍emplace_back减少内存拷贝和移动. ...

  2. Binder内存拷贝的本质和变迁

    说起Binder的内存拷贝,相信大多数人都听过"一次拷贝":相较于传统IPC的两次拷贝,Binder在数据传输时显得效率更高. 其实不少人在面试时都能回答出上面这句话,但若是追问他 ...

  3. C++11实现高效内存池

    C++11实现高效内存池 前言 项目介绍 内存池是什么 allocator详解 MemoryPool.tcc allocateBlock 创建Block块 padPointer 空间对齐 Memory ...

  4. C++编码中减少内存缺陷的方法和工具

    2019独角兽企业重金招聘Python工程师标准>>> C++编码中减少内存缺陷的方法和工具 程振林,方金云,唐志敏 (中国科学院计算技术研究所,北京 100080) 摘 要:基于C ...

  5. java gc 次数_浅谈如何减少GC的次数

    GC会stop the world.会暂停程序的执行,带来延迟的代价.所以在开发中,我们不希望GC的次数过多. 本文将讨论如何在开发中改善各种细节,从而减少GC的次数. (1)对象不用时最好显式置为 ...

  6. 多媒体指令(内存拷贝加速)

    本来自己写了一个,不过性能竟然和memcpy一样,一点提升都没有,所以有就去网上找了一个性能好的. 下面的程序是对100MB数据进行内存拷贝. 我测试了一下. 直接调用memcpy时间为100ms左右 ...

  7. 第 11 章 直接内存

    第 11 章 直接内存 1.直接内存概述 直接内存 不是虚拟机运行时数据区的一部分,也不是<Java虚拟机规范>中定义的内存区域. 直接内存是在Java堆外的.直接向系统申请的内存区间. ...

  8. C语言常用库函数实现(一)_内存拷贝

    库函数的实现也是面试中的常考题,因为这是最能体现C语言功底的. 一.strcpy与strncpy     先看一下函数的原型:           strcpy函数可以按如下的方式实现: 点击(此处) ...

  9. OpenCV源码解读:Mat与GpuMat的内存拷贝(copyTo和clone)

    前言 OpenCV基础类型Mat以及GPU上的GpuMat是整个OpenCV工程体系中两种非常基础常用的类型.通常情况下Mat拥有的方法,GpuMat都会有对应的方法.对于内存拷贝,有两个常用的方法c ...

最新文章

  1. return true Java_[Java教程]js中return,return true,return false的用法及区别
  2. pkill 和 pgrep总结
  3. python之time模块和hashlib模块
  4. 阻塞、非阻塞、超时(同步与异步)
  5. mmdetection 使用笔记 01: 安装与简单的推理demo
  6. 有关Navigation的研究——Silverlight学习笔记[29]
  7. URL编码 java
  8. Qt5中this application has requested the runtime to terminate it in an unusual way 无法运行问题的解决
  9. JVM调优参数简介、调优目标及调优经验
  10. 宏基台式计算机设置硬盘启动,Acer宏碁台式电脑bios设置u盘启动详细步骤
  11. html 表单 js 提交,js实现表单提交submit(),onsubmit
  12. 使用cmd命令查看WiFi密码
  13. 怎么查询oracle归档模式,查看oracle数据库归档模式
  14. STM32在线烧录程序的开发
  15. Elasticsearch-8.2.0安装问题
  16. 制作u盘版的kail linux 系统,即插即用,用于破解邻居妹子家的wifi
  17. vue中beforeupdate意思_VUE的生命周期之beforeMount、mounted、beforeUpdate、updated
  18. mysql 中文模糊查询_解决mysql中文模糊查询问题的方法
  19. 大学java程序设计期末考试,成功跳槽阿里!
  20. STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出

热门文章

  1. Android涂鸦技术及刮刮乐示例分析
  2. 于计算机交朋友教案,三年级上册信息技术教案-2与计算机交朋友|人教版 (2)
  3. 剑指Offer #04 重建二叉树(递归)
  4. L2-006 树的遍历-团体程序设计天梯赛GPLT
  5. 【linux技术】分布式存储技术实战演练
  6. 一文读懂 Shell 中各种括号的作用
  7. 集群镜像:实现高效的分布式应用交付
  8. K8s 文档增加反种族歧视声明 | 云原生生态周报 Vol. 54
  9. 函授计算机与科学论文,函授计算机科学与技术论文
  10. 企业管理系统java web_JavaWeb 基于 web的 企业人事管理系统 Jsp/Servlet 242万源代码下载- www.pudn.com...