搜索
查看
编辑修改
首页
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
android 圆形相机预览拍照_Flutter自定义相机,Flutter相册选择照片
2
字典树 - 核心思想及其代码实现_字典树如何构建
3
Stable Diffusion干货教程:3种用AI高清放大图片方法_stable diffusion后期处理
4
递归算法简单实现_请用递归编程实现。
5
LLM——大语言模型完整微调策略指南_大语言模型微调
6
vue3 组合式 API:setup()_setup组合式的order-in-components如何配置
7
根号10在Java中写成_开根号_乐鑫科技笔试题_牛客网
8
前端环境搭建:node.js、npm的下载和安装
9
论文阅读-Transformer Layers as Painters
10
【2024软件测试面试必会技能】Selenium(5):元素定位的介绍及使用_最新f12selenium元素定位
当前位置:
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博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/1015295
推荐阅读
article
WordPress
添加
自定义
小
工具
_
wordrpess
调用
自定义
小
工具
...
本文介绍了如何在
WordPress
中添加
自定义
天气小
工具
。由于
WordPress
默认未提供此功能,作者通过在cj.wea...
赞
踩
article
Docker
学习(十九)
什么
是
镜像
的
元
数据
?_
docker
的
元
数据
是
什么
...
Docker
学习(十九)
什么
是
镜像
的
元
数据
?_
docker
的
元
数据
是
什么
docker
的
元
数据
是
什么
...
赞
踩
article
centos8
安装
jenkins
,
gitee
+webHook配置_
centos8
安装
gitee
...
本文档详细介绍了在CentOS8上
安装
Jenkins、配置自动化部署,包括
安装
Java环境、Jenkins及其用户设置、...
赞
踩
article
VS
Code
中如何进行使用标准库
std
c++
和
多线程
pthread调试_
vscode
多线程
调试...
如果使用命令行编译:g++ main.cpp -l
std
c++
则没有问题。分析可知是代码中使用了标准库,但是在vsco...
赞
踩
article
关于IIS安全设置
http
能
访问
http
s不能
访问
的解决方案_iis部署
htttps
无法
访问
...
在配置IIS时遇到问题,虽然HTTP正常,但HTTPS
无法
访问
。确认配置无误后,问题出在服务器防火墙和阿里云安全组规则。...
赞
踩
article
Vue
常用
插件
集合_
vue
-
moveable
...
UI组件element- 饿了么出品的
Vue
2的web UI工具套件Vux- 基于
Vue
和WeUI的组件库mint-ui...
赞
踩
article
网络
爬虫
|
采集
穷游网
某城市
旅游景点
...
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术...
赞
踩
article
uniapp
短
视频
浏览
组件
(仿抖音、上
滑
下
滑
)
组件
Ba-
VideoSView
_
uniapp
好用...
Ba-
VideoSView
是一款
uniapp
短
视频
上划
浏览
组件
,支持无限
滑
动加载,支持自定义界面(功能遮罩),支持点播...
赞
踩
article
计算机
毕业设计
-基于
python
的
旅游
信息
爬取
以及
数据分析_
爬取
旅游
出发地和目的地...
通过这次
毕业设计
,我又一次的感受到了
python
这门编程语言的魅力所在,它简单易懂的代码
以及
丰富的库给我留下了深刻的印象...
赞
踩
article
SSH
:
加密
安全
访问
网络
的革命性
协议
_
ssh
模式...
在现代信息化的世界中,数据传输和
网络
连接的
安全
性是至关重要的。
SSH
(SecureShell)
协议
作为保障
网络
通信
安全
的...
赞
踩
article
不能真
“
生成
代码
”
的
“
低
代码
”
平台
,不可能真正获得
程序员
的
认可...
我和一个
程序员
聊天
的
时候,他是这么评价低
代码
平台
的
“
低
代码
平台
想证明
程序员
都是傻B,又想让
程序员
买单”!不能真
“
生成
代码
...
赞
踩
article
Vue
脚手架创建
TS
项目_
vue
ts
...
预处理选项,他会在后面一步让你选则对应扩展语言的预处理器。的基础上,设计了泛型、对象、继承、数据类型等等。的一个超集 正...
赞
踩
article
[
CF1038E
]Maximum Matching_
cf1032f
vasya
and
maximu...
奇怪的题目……_
cf1032f
vasya
and
maximum
matching
cf1032f
vasya
and
...
赞
踩
article
终于
有人
把
Docker
讲清楚
了
,
万字详解!...
点击上方“java大数据修炼之道”
,
选择“置顶公众号”关键时刻
,
第一时间送达!每日英文Nurture passes na...
赞
踩
article
Json
字符串
内容
比较-超实用版
_
json
对比
...
json
内容
动态
对比
_
json
对比
json
对比
背景 之前有类似接口diff
对比
,数据...
赞
踩
article
推荐
一款
开源免费
的
离线
OCR
软件
:
Umi
-
OCR
...
是
一款
离线
OCR
软件
,批量导入本地图片 / 读取剪贴板,识别图片中
的
文本,输出到
软件
面板或本地 .txt / .md 文...
赞
踩
article
Python
中的
join
函数
_
python
join
函数
...
原文链接:https://cloud.tencent.com/developer/article/1694327Pyth...
赞
踩
article
Docker
序列-
9
Docker
主机
集群化方案
Docker
Swarm
...
早期使用service发布,每次只能发布一个service。yaml可以发布多个服务,但是使用docker-compos...
赞
踩
article
【图说】
VMware
&
Ubuntu22.04
详细
安装
教程
_
ubuntu
2204
vmware
...
本文详细介绍了如何在
VMware
上
安装
VMware
WorkstationPro,以及如何在其中配置和使用Ubuntu22...
赞
踩
article
【
Android
】
实现
一个
优雅的自定义
底部
导航
栏(速通安卓大作业必备)_
android
底部
导航
栏...
本篇文章提供了
一个
实现
自定义
底部
导航
栏的示例,能够帮助想要水过安卓大作业
实现
一个
较为优美的
底部
导航
界面,希望对大家有所帮...
赞
踩
相关标签
docker
学习
容器
jenkins
运维
c++
算法
开发语言
c语言
linux
vscode
安全
vue插件
爬虫
python
python3.11
数据库
uni-app
原生插件
抖音
视频浏览
短视频
课程设计
旅游