代码区、常量区、静态区(全局区)、堆区、栈区

1.前言

  从大一学习C语言,到现在每天的刷题,学习编程虽然已经有两年了,但是感觉真正入门始于最近两个月刷算法题,不会算法何谈编程功底?虽然算法很重要,但是计算机的原理也很重要。一直对程序运行时的堆栈区略有耳闻,但是一直不太了解。怀着好奇的心情,查阅了很多资料,写下这篇博客。

2.概念

  这里以C/C++为例,其他编程语言虽略有不同,但大体相同。C/C++编译的程序占用的内存分为几个部分:

2.1 栈区(stack sagment):

  由编译器自动分配释放,存放函数内的局部变量形参函数返回值等。在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。栈顶的地址和栈的最大容量是程序在编译时就预设好的,在Windows下,栈的大小是1M(或2M),如果申请的空间超过栈的剩余空间时,将提示stack overflow。因此,能从栈获得的空间较小。不过有些编译器可以设置栈的大小。

所以编程时有以下需要注意的:
(1)尽量将大数组作为全局变量或者静态变量;
(2)递归层次不能太多,DFS要充分剪枝等

2.2 堆区(heap sagment)

  一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收 。它与数据结构中的堆是两回事。堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

思考

既然这里的堆与数据结构中的堆(优先队列)不是一回事,那么为什么会用这个名字呢?在国外著名IT网站stackoverflow.com有人曾经提过这个问题。下面有大牛已经为我们很好地解释了。
在这里插入图片描述
点赞数最多的一个回复是这样说的:在《The Art Computer Programming》中有提到,但是没有提到具体的考究,只是说这个词与优先队列有某种联系。
在这里插入图片描述
下面就有人评论说:维基百科声称早期的Lisp语言中曾用过优先队列来实现堆区的存储。
在这里插入图片描述
另有人说,只是有同样的名字,但是并不是一个概念。存储上堆的概念就好像是“一堆衣服”,它表征的是某个混乱的存储区域可以按意愿进行分配。
在这里插入图片描述
那么,总结一下这些牛人的话就是:早期存储概念上的堆区曾用过数据结构上堆的概念进行实现,而且堆区的存储是将一些离散的、杂乱无章的存储单元整合到一起(也就是前面说的它是按链表进行组织的),然后进行分配,从这两方面来看,这就是“堆”名字的由来。

感谢dalao,终于解答了我的困惑~

2.3 全局区(静态区)(data sagment)

  全局变量和静态变量的存储区域是在一起的,程序结束后由系统释放。数据区的大小由系统限定,一般很大。

2.4 常量区

常量、以及常量字符串就是放在这里的,程序结束后由系统释放。

2.5 程序代码区

存放函数体的二进制代码。


3.对应的存储区域

程序需要先从外存加载到内存才可以运行,上面所讲的这些存储区域也都是在内存中。代码区和常量区由于是不需要更改的,存储在ROM(只读),而静态区、堆栈区则被存储在RAM(可读可写)。


参考资料

1.https://blog.csdn.net/liuhuiyi/article/details/8207021
2.https://blog.csdn.net/u014470361/article/details/79297601
3.https://stackoverflow.com/questions/1699057/why-are-two-different-concepts-both-called-heap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值