搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
爱喝兽奶帝天荒
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
每天搞懂一个小漏洞——jwt_jwt越权
2
【重磅】2024国内主流AI 大模型架构及应用场景深度分析_ai大模型框架
3
开发者实战 | 如何应用Anomalib在数据集不平衡的情况下检测缺陷?-上篇
4
ChatGLM3在Docker环境部署_docker部署安装chatglm3
5
IDEA的pom.xml文件上面有蜘蛛标志_idea中xml意外的标记
6
学习 JSON.parseObject 和 JSON.toJSONString 一篇文章就够了
7
免费,Python蓝桥杯等级考试真题--第7级(含答案解析和代码)_python 七级
8
acm专题学习之动态规划(一)状压dp+记忆化搜索+uva 10651 - Pebble Solitaire_acm 旅行商问题 记忆化搜索
9
pip升级报错,或者pip install pywin32报错_pip 安装pywin32报错
10
超详细教程 | Hands-On 基于 Flagchip FC4150 MCAL-PWM 驱动 RGB灯
当前位置:
article
> 正文
C++内存管理变革
作者:爱喝兽奶帝天荒 | 2024-08-22 07:26:00
赞
踩
c++内存管理
本文已经迁移到:
http://cpp.winxgui.com/cn:story-of-c-memory-management-innovation
C++
内存
管理变革
许式伟
2005-7-16
关键字: 内存管理 垃圾回收器 内存配置器 引用计数
keyword: memory manage, memory recycler, allocator, reference count
引言
C/C++语言的内存管理经历了几次变革,但至今仍未能趋于成熟。这几次变革主要包括:
1.
从malloc/free到new/delete。这场变革是OOP技术兴起的产物。C++是强类型语言,new/delete的主要成果也就是加强了类型观念,减少了强制类型转换的需求。但是从内存管理角度看,这个变革并没有多少的突破性。
2.
从new/delete到内存配置器(allocator)。自从STL被纳入C++标准库后,C++世界产生了巨大的变化。而从内存管理角度来看,allocator的引入也是C++内存管理一个突破。留意一下你就可以发现,整个STL所有组件的内存均从allocator分配。也就是说,STL并不推荐使用new/delete进行内存管理,而是推荐使用allocator。
然而,STL的allocator并没有导致C++语言在内存管理上发生巨大的变化。除了STL本身外,并没有多少人使用allocator,甚至是意识到allocator的重要性。所以C++程序员在使用STL的同时,依旧在使用new/delete进行烦琐的内存分配/释放过程。
究其原因,主要有二。一是allocator的引入,STL设计者主要可能还是出于将内存管理从容器的实现独立出来的设计理念作用,让STL使用者在内存管理算法上有选择的余地。设计者本身都可能也没有意识到allocator的重要性。二是allocator本身也只是侧重于关注效率上,而没有侧重于C++语言使用者对内存管理观念的变革上。
总之,在我看来,STL的引入allocator,是一件了不起的事情。但是这场变革被忽视了,没有得到贯彻。当然,这也与STL的allocator本身的缺陷有关。
本文要讨论的,正是如何贯彻STL的allocator思想,对其进行适当的改进,以期在C++内存管理观念上产生变革性的突破,彻底淘汰传统的new/delete内存管理方法
[1]
。
垃圾回收器
几乎所有目前流行的垃圾回收器,均倾向于将使用者当作一个傻瓜,期望能够让使用者在完全不理解内存管理的情况下,可以很好的使用它。应该说这它们基本上都也做到了(虽然使用者有时也有这样那样的烦恼,但总体来说情况确实得到了很大程度的改善)。然而这一设计理念我并不十分认同。
首先,可以在一个提供垃圾回收器的语言中自如的工作,没有被垃圾回收器所困扰,本身已经是很了不起的事情,他们绝对是非常聪明的人,而不是傻瓜。他们理解垃圾回收器的工作原理,选择它并且让它为他们工作,只是因为还有更重要的事情等着他们去做。必要的时候,他们需要有办法控制垃圾回收器,使它按照他们的意愿工作。因此,垃圾回收器的设计要点在于把使用者从烦琐的内存管理中解脱出来,使得他们可以将全部精力投入到本身的业务逻辑上,而不是让垃圾回收器看起来更傻瓜式。
其次,使用一个全自动的垃圾回收器,在内存回收的时机不明确的情况下,垃圾回收器的工作过程有很大的不确定性,这给使用者带来烦恼。例如C#在调用非管制代码(如调用Win32 api)时,这些问题变得突出。一个不小心,就有可能出现Win32 api还在使用一块内存,而垃圾回收器已经把它回收了的情形。在小心翼翼的避开这些陷阱时,这种感觉其实与C/C++程序员遗憾语言没有垃圾回收器的感觉有点类似。
因此,最理想的情况,是内存管理器提供垃圾回收的能力,但是它也只是提供这个能力而已,
至于什么时候进行垃圾回收,完全可以由用户自己控制。另外,用户也可以强制释放一块内存,而不是完全被动的等待垃圾回收过程决策何时回收该内存
。对于客户来说,他有权掌控一切,只是如果万一他确实疏忽了,垃圾回收器能够为他护航。
将垃圾回收器引入C++,有没有这种可能呢?我认为,如果我们试图提供一个全自动的垃圾回收器,这相当困难。我们看到以Microsoft之能,仍然无法把这件事做好
[2]
。或许,我们需要改变一下观念:一个半自动的垃圾回收器,也许就可能可以和C++融洽相处了呢?
初识allocator
allacator中文称为“内存配置器”,通常它是一个类,负责提供内存管理(可能包含内存分配、释放、自动回收等能力)相关的服务。例如,我们通过C提供的malloc/free即刻提供一个allocator实作出来:
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
【wpsshop博客】
推荐阅读
article
运维
工程师
都在做
什么
?_有
运维
工程师
经验
可以
干
什么
...
运维
到底需要做哪些工作?网络,系统,安全,存储,测试,研发……全都要会!_有
运维
工程师
经验
可以
干
什么
有
运维
工程师
经验
可以
...
赞
踩
article
JMeter
-
BeanShell
预
处理
程序
和
BeanShell
后置
处理
程序
的应用_
beanshell
...
BeanShell
。_
beanshell
preprocessor
beanshell
preprocessor
...
赞
踩
article
TLS
握手
及其报文
详细分析
,
服务器
视角_
mbedtls
握手
...
TLS
(传输层安全协议)
握手
是建立安全通信通道的关键过程。这个过程涉及客户端和
服务器
之间交换一系列消息,以协商加密算法、...
赞
踩
article
Unity
获取
当前
系统
时间
实时显示并
格式化
输出_
unity
输出场景
时间
...
我们希望在
Unity
开发的软件里面如果
当前
系统
时间
戳并显示在UI上,那么如何实现呢?其实很简单,C#为我们提供了一个关于...
赞
踩
article
2021
保研
夏令营
—
中科院
计算所,
自动化
所,
上海交大
计算机
_
中科院
夏令营
申请难度...
2022
保研
经历分享
夏令营
开始前的准备阶段(5—6月)个人情况准备
夏令营
报名材料
夏令营
(7月)
上海交大
电院
计算机
夏令营
开...
赞
踩
article
build
_
ext
--
inplace
是什么意思_
build
ext
ension
--
inplace
...
如果是做目标检测类的任务,经常需要用到cocoapipython setup.py
build
_
ext
--
inplac...
赞
踩
article
Python
爬取QQ
音乐
并
下载
...
参考博客:https://www.w3cschool.cn/article/14374 import requestsi...
赞
踩
article
c++
-多
进程
...
深未来技术原创文章,如转载,请注明来源http://deepfuture.iteye.com/blog/748242!...
赞
踩
article
毕业设计
:
Python
网易
云
音乐
数据
采集分析系统
Flask
框架(源码)建议收藏✅_基于
python
...
毕业设计
:
Python
网易
云
音乐
数据
采集分析系统
Flask
框架(源码)建议收藏✅_基于
python
的网易
云
音乐
数据
分析...
赞
踩
article
探索
MCQTSS
_
QQ
Music
:一款创新的
QQ
音乐
爬虫
工具...
探索
MCQTSS
_
QQ
Music
:一款创新的
QQ
音乐
爬虫
工具项目地址:https://gitcode.com/MCQTS...
赞
踩
article
MySQL
表
空间
碎片
_mysql表
碎片
...
本文介绍了
MySQL
中表
空间
碎片
的产生原因,如已删除行未物理删除、可变长度列修改导致的空白
空间
。清理
碎片
能减少磁盘
空间
使...
赞
踩
article
Jmeter
常用
断言
之
BeanShell
断言
详解...
Beanshell是一种类似JAVA的脚本语言,通过
BeanShell
可以对请求数据、响应数据或环境变量进行更加灵活的处...
赞
踩
article
谷歌云
TPU
服务
正式全面开放:「
AlphaGo
背后的
芯片
」进入商用化...
来源:机器之心概要:作为科技巨头的谷歌早已把这种高度定制化产品应用在了自己的
服务
器中,而本周一,谷歌宣布其他公司马上也将...
赞
踩
article
当
http
可以
访问
http
s
无法
访问
时,你要做的
第一件
事!...
问:
http
可以
访问
http
s
无法
访问
,造成该问题的原因很多,但我们应该做的
第一件
事是什么?答:检查端口是否开启,刚接触...
赞
踩
article
SpringBoot
+
proguard
+
maven
多
模块
实现代码混淆_
springboot
ja...
本文介绍了如何在
SpringBoot
的多
模块
Maven工程中实现Proguard代码混淆。主要步骤包括在需要混淆的
模块
p...
赞
踩
article
SPA
和
MPA
的区别...
单页面与多页面的区别(1)单页应用(SinglePage Application ,
SPA
)指只有一个主页面的应用,一...
赞
踩
article
IT
学生
学习指南...
本文主要为了计算机相关专业的
学生
而写。内容是从本博主的工作经验和教学经验当中总结出来的一些干货,涵盖了从大一到大四期间学...
赞
踩
article
Arduino
连接
蓝牙
(HC-
05
)_
arduino
蓝牙
...
本文详细介绍了如何通过USB-TTL和
Arduino
两种方式设置HC-
05
蓝牙
模块进入AT模式,包括接线步骤和所需AT指...
赞
踩
article
二.重新回炉
Spring
Framework
:
Spring
Framework
主要
组件概览_spri...
这里
主要
简单说一下
Spring
Framework
的几个核心组件的总体情况。为了比较直观,这里使用了ClassPathX...
赞
踩
article
探索
情感
分析
的
新高度:
Senta
与
SKEP
模型
...
探索
情感
分析
的
新高度:
Senta
与
SKEP
模型
Senta
Baidu's open-source Sentiment A...
赞
踩
相关标签
运维
工程师
做什么
技能
jmeter
git
github
软件测试
自动化测试
功能测试
程序人生
安全架构
unity
经验分享
游戏引擎
DateTime
人工智能
build_ext
--inplace
cocoapi
cython
扩展库
C
C++