C++11如何减少内存拷贝次数
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如何减少内存拷贝次数相关推荐
- emplace_back减少内存拷贝和移动
--------<深入应用C++11:代码优化与工程级应用>第2章使用C++11改进程序性能,本章将分别介绍右值引用相关的新特性.本节为大家介绍emplace_back减少内存拷贝和移动. ...
- Binder内存拷贝的本质和变迁
说起Binder的内存拷贝,相信大多数人都听过"一次拷贝":相较于传统IPC的两次拷贝,Binder在数据传输时显得效率更高. 其实不少人在面试时都能回答出上面这句话,但若是追问他 ...
- C++11实现高效内存池
C++11实现高效内存池 前言 项目介绍 内存池是什么 allocator详解 MemoryPool.tcc allocateBlock 创建Block块 padPointer 空间对齐 Memory ...
- C++编码中减少内存缺陷的方法和工具
2019独角兽企业重金招聘Python工程师标准>>> C++编码中减少内存缺陷的方法和工具 程振林,方金云,唐志敏 (中国科学院计算技术研究所,北京 100080) 摘 要:基于C ...
- java gc 次数_浅谈如何减少GC的次数
GC会stop the world.会暂停程序的执行,带来延迟的代价.所以在开发中,我们不希望GC的次数过多. 本文将讨论如何在开发中改善各种细节,从而减少GC的次数. (1)对象不用时最好显式置为 ...
- 多媒体指令(内存拷贝加速)
本来自己写了一个,不过性能竟然和memcpy一样,一点提升都没有,所以有就去网上找了一个性能好的. 下面的程序是对100MB数据进行内存拷贝. 我测试了一下. 直接调用memcpy时间为100ms左右 ...
- 第 11 章 直接内存
第 11 章 直接内存 1.直接内存概述 直接内存 不是虚拟机运行时数据区的一部分,也不是<Java虚拟机规范>中定义的内存区域. 直接内存是在Java堆外的.直接向系统申请的内存区间. ...
- C语言常用库函数实现(一)_内存拷贝
库函数的实现也是面试中的常考题,因为这是最能体现C语言功底的. 一.strcpy与strncpy 先看一下函数的原型: strcpy函数可以按如下的方式实现: 点击(此处) ...
- OpenCV源码解读:Mat与GpuMat的内存拷贝(copyTo和clone)
前言 OpenCV基础类型Mat以及GPU上的GpuMat是整个OpenCV工程体系中两种非常基础常用的类型.通常情况下Mat拥有的方法,GpuMat都会有对应的方法.对于内存拷贝,有两个常用的方法c ...
最新文章
- return true Java_[Java教程]js中return,return true,return false的用法及区别
- pkill 和 pgrep总结
- python之time模块和hashlib模块
- 阻塞、非阻塞、超时(同步与异步)
- mmdetection 使用笔记 01: 安装与简单的推理demo
- 有关Navigation的研究——Silverlight学习笔记[29]
- URL编码 java
- Qt5中this application has requested the runtime to terminate it in an unusual way 无法运行问题的解决
- JVM调优参数简介、调优目标及调优经验
- 宏基台式计算机设置硬盘启动,Acer宏碁台式电脑bios设置u盘启动详细步骤
- html 表单 js 提交,js实现表单提交submit(),onsubmit
- 使用cmd命令查看WiFi密码
- 怎么查询oracle归档模式,查看oracle数据库归档模式
- STM32在线烧录程序的开发
- Elasticsearch-8.2.0安装问题
- 制作u盘版的kail linux 系统,即插即用,用于破解邻居妹子家的wifi
- vue中beforeupdate意思_VUE的生命周期之beforeMount、mounted、beforeUpdate、updated
- mysql 中文模糊查询_解决mysql中文模糊查询问题的方法
- 大学java程序设计期末考试,成功跳槽阿里!
- STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出
热门文章
- Android涂鸦技术及刮刮乐示例分析
- 于计算机交朋友教案,三年级上册信息技术教案-2与计算机交朋友|人教版 (2)
- 剑指Offer #04 重建二叉树(递归)
- L2-006 树的遍历-团体程序设计天梯赛GPLT
- 【linux技术】分布式存储技术实战演练
- 一文读懂 Shell 中各种括号的作用
- 集群镜像:实现高效的分布式应用交付
- K8s 文档增加反种族歧视声明 | 云原生生态周报 Vol. 54
- 函授计算机与科学论文,函授计算机科学与技术论文
- 企业管理系统java web_JavaWeb 基于 web的 企业人事管理系统 Jsp/Servlet 242万源代码下载- www.pudn.com...