与非网@你知道程序的“肾”是什么吗?
在本文的开头 , 我必须声明这是一篇有目的性的文章 。 我有一个长辈最近得了尿毒症 , 所以我联系芯片之家的管理员并且得到他非常爽快的允许 , 在芯片之家的平台将人体的肾功能与开发技术结合起来写一篇文章发表在这里 , 希望得到更多人的帮助 。 所以 , 请记住:不管您是转发本文 , 点在看 , 还是点击原文轻众筹给予帮助或者转发 , 都是一次善举 。
程序的形态非常之多 , 不管是可以作为一个操作系统 , 还是作为一个helloworld , 也不管是作为一个app , 还是作为一个嵌入式的固件 。 程序在本质上来说 , 是函数代码与资源的集合体 。 我们的话题是 , 程序的资源 , 而且是程序中第一要素的资源——内存 。

文章图片
如果说程序是一个人 , 那么骨架可以比喻成程序的架构 , 皮肉则是代码 , 血液则是内存 。 在程序的运行过程当中 , 绝大部分的指令在执行与回写操作 , 我必须声明这是一篇有目的性的文章 。 所以我联系芯片之家的管理员并且得到他非常爽快的允许 , 回写阶段都会操作到内存 , 可以说内存伴随着程序执行的整个周期 , 就像是血液始终流转在我们的肉体之中 。 那么在内存中进行垃圾回收的程序之“肾”,又是什么呢?

文章图片
这是一段非常简单的C语言代码 。 对于稍微有点基础的人都知道在这段程序中 , 每一个变量所占用的内存位置 。
首先全局变量与静态变量是放在数据段(RW段 , 其中未初始化的放在ZI段 , 由程序启动的时候统一清内存)比如:a,b,c;
局部变量放在栈空间中 , 比如:d,e;
同时还申请了一段存放于堆的内存 , 但是代码中并未使用free函数进行释放 。
根据内存的特性我们知道 , 对于a,b,c等数据段的变量 , 它们是常住内存的 , 生命周期是永久的 。 对于栈里面的局部变量d,e 。 它们的生命周期仅仅在“{}”之内 , 伴随着栈操作的push以及pop指令 , 创建和消亡 。
程序中当e消亡在花括号外后 , 在堆中申请的内存就失去了指针对它的指向导致了内存泄漏 。 如果是在简单的程序中 , 这样的情况处理起来还是比较简单的 , 我们只要在程序后面采用free函数释放内存就可以 。 但是如果在拥有复杂的逻辑程序 , 这样动态申请的内存就需要花不少心思去管理 。 这个就是为啥很多java之类的高级语言在制作教程的时候都会在与C/C++比较时经常强调 , java没有指针并且拥有垃圾自动回收机制 , 会显得更加安全 , 程序的健壮性更加容易得到保证 。 (当然C/C++也可以写出健壮的程序 , 只是有些东西没那么方便) 。 这种可以自动帮助程序进行内存自动垃圾回收的机制就是程序的“肾”了 。
那么为啥C/C++到现在都不支持垃圾自动回收机制呢?我们可以从自动垃圾回收机制的原理去寻到答案 。 首先说一下自动垃圾回收的判定算法 , 一般常用的是两个:
一、引用计数法 。
所谓的引用计数法 , 顾名思义就是在内存的描述结构体内部采用一个计数变量进行计数 。 每当有指针或者引用指向该内存块的时候 , 该内存块的描述结构体内部的计数器就递增 。 当指针或者引用被释放或者改变的时候就递减 。 当内存块的计数递减到0的时候 , 就可以释放回收该内存块了 。
引用计数法 , 应该说是最简单实现内存可回收判定的算法 。 采用该算法实现自动回收机制的典型的有apple开发平台Object-C支持的ARC机制 。 这种自动垃圾回收算法的实现有一个依赖和一个缺点 。 它的依赖就是需要编译器自动插入计数代码 。 想OC在xcode平台开发程序 , 它的编译环境会自动地插入手动进行计数的函数retain , release这样的语句 。 所以这个实现自动垃圾回收的本质还是让编译器做手动该做的事情而已 。 如果说C也需要实现类似的方式进行自动回收 , 那么就需要对编译器的预处理过程进行改造 , 并且在内存申请和释放的库函数之上维护一个内存的监控结构 , 去给内存块做计数 。
推荐阅读
- 宇信科技共享“员工健康打卡”程序助力复工复产
- 娱乐先知道了■搭2.4T全时四驱,斯巴鲁全新傲虎了解一下?,颜值空间外媒爱疯了
- 「右手网」Google Assistant 可以准备“快捷方式”和支持的应用程序的内置列表,新的
- 「OFweek维科网」两条海缆先后故障 南非网络连接受影响,封锁之下
- 『子期观史』就知道为何慈禧绞尽脑汁,却一辈子也斗不过她,看看真正的慈安
- 「制空少年」成长路上的三道坎,尽早知道,尽早做准备,大学参军入伍
- 新迈腾变速箱的吸引力有多大,看看的销量就知道了
- 【极速聊科技】小米官方小程序2.0上线:新增3大功能!
- 『历史差役』曾出现在历史课本中,你知道是什么吗?,他死后光绪写了一副挽联
- IT之家▲线下门店现排队潮,瑞幸咖啡App/微信小程序双双宕机
