(上文书说道图笨笨在网络上找到一位请教内存堆栈的问题,这位牛人的ID叫FreeBSD)
FreeBSD:栈是由操作系统管理的空间,堆是软件自己管理的。栈是连续的空间,堆就不一定了。一般局部变量,以及函数的调用参数都放在栈上。malloc之类的函数申请的空间是在堆上。
tutbnt(这是图笨笨在论坛的ID):还望大神详加指点
FreeBSD:内存这个东西呢,很宝贵的。
tutbnt:知道,一条4G的200多块。
FreeBSD:一般我们的计算机上呢,是有操作系统的。
tutbnt:恩。
FreeBSD:计算机的资源都是由操作系统来管理的,内存也不例外。
tutbnt:哦……
FreeBSD:操作系统会用某种方式去管理内存,记录着内存空间中哪里是空闲的,哪里是已用的,已用的部分是被那个程序用的。
tutbnt:某种方式?什么方式?
FreeBSD:这个比较复杂,不同的系统,使用的方式也不尽相同。最简单的方式,比如可以用链表的形式,把所有空闲块作为链表的表项串联起来。比如这样:
tutbnt:哦……你画的挺好看的,你学美术的吧?
FreeBSD:-_-||
tutbnt:大神继续。
FreeBSD:当一个程序,或者说二进制文件、ExE文件运行的时候,操作系统首先会根据这个程序的大小,计算出加载这个程序所需要的内存大小。然后从所有空闲的空间中找出一块比较合适的来,把要执行的程序,从硬盘复制到内存里。一个程序加载的时候需要的内存大概有两部分:程序代码和变量。
tutbnt:哦,就两部分,不算多,好记。
FreeBSD:嘻嘻,看似简单哦。你知道程序代码是指什么?
tutbnt:比如我写的printf(“HelloWorld!\n”)?
FreeBSD:恩,差不多吧,不过编译好的程序在内存里肯定不会存着这样的c语言源码,他们已经编译成了机器码了。
tutbnt:哦,没有printf了啊,我就看它眼熟呢。
FreeBSD:可见你除了HelloWorld没写过啥有意思的玩意-_-b
tutbnt:那么,程序代码,就是C语言的程序编译后的机器码咯,这些东西要放到内存里。
FreeBSD:是的。
tutbnt:为什么?
FreeBSD:厄……?
tutbnt:为什么非要放到内存里?不能在硬盘里执行么?
FreeBSD:当然不能了。
tutbnt:为什么不能呢?
FreeBSD:这个……好像……因为硬盘太慢吧?
tutbnt:SSD的硬盘很快啊。
FreeBSD:那虽然是快点,但是……厄……也……不如内存快吧……(大概吧)
tutbnt:好吧,等我回去好好学习一下再来问你这个问题。
FreeBSD:好(这家伙终于放弃问这个奇怪的问题了)
tutbnt:那继续说内存的问题,一部分是程序代码,这个我理解了。另一部分是变量?
FreeBSD:是的,另一部分,就是你的程序里声明的所有全局变量。
tutbnt:只有全局变量?
FreeBSD:是的,只有全局变量。
tutbnt:没有局部变量?
FreeBSD:是的
tutbnt:为什么?
FreeBSD:又来了……
tutbnt:局部变量也得有空间啊
FreeBSD:有的,会有的,一会咱们再说。
tutbnt:好吧。