按照老版操作系统来学习,内存对于程序来讲分四区。分别是 代码区,静态区,栈,堆。
由上面程序执行的结果可知:
貌似结果就是 静态代码堆栈
静态区存放的是程序中所有静态变量和常量的值。静态区的大小是程序加载到内存之后就固定的,不会再发生改变。
代码区中存放的是程序中的代码,不能修改它的值,只能通过指针或者变量名来使用函数。【当然强行修改是被允许的但是可能发生未知错误。】
堆是一块很大的区域,通常情况下是4G的大小,(这个数字通常情况下是虚拟的,但是可以利用现代操作系统来利用硬盘模拟出来这么一块儿空间,因为我们随便开几个程序这就一下把内存撑死了。所以这个 4G是一个虚拟的情况,我们编程的时候就考虑这是一个4G的很大空间就可以了,然后 要记得自己分配的空间及时还回去。)
栈,栈对于不同的操作系统来讲,其大小不固定,有大有小,通常情况下在4k或者8k左右,64k就顶天了。但是 不同的是:栈对于一个线程来讲,就有一个栈,如果一个进程有4个线程,那么这个 线程区域就有4个栈。
对于整个分配过程来讲,可以看到我们是从地址的高位开始往下分配了静态区域,代码区域,堆,栈,所以可以想见:对于里面的每一个东西来讲,分配都是从上到下的
根据这个结果来分析一下对于内存的分配关系:
堆这里不太敢说,但是对于栈来讲,先进后出,从下面入,下面出。
并且它的释放是按照,代码块儿的形式释放的,按照取地址的方式取得具体的某一个数字的值的。
我们的验证结果跟这个图还是基本一致的,除了 静态区和代码区多少有点出入以外。栈的上面是栈底,我们一行一行往里面写数据,然后在释放数据。堆里面不断地开辟空间,进行使用。想到了之前我们说的。在windows里面内存使用的大端对齐,拿我们的程序的高位对内存的低位。而对于某些大型服务器的系统来讲,是小端对齐。拿程序的低位对应内存的低位。
既然知道了内存的分配,那么希望我们所写的代码尽量少的使用内存。
所以在编程的时候:这样写:Char[9].总感觉比Char[10]要省一个字节。那么真的如此么?
于是跑了一段这样的代码:
我的系统得到的结果是每次都会增加4k。
按照视频的讲解的思路就是:当我们的程序在malloc的时候,都会开辟32k大小的一块空间,每32k上面有4k大小的内存页,我们申请了一段内存,就先可着头一个4k大小的内存页使,当用完当前这个内存页之后,从32k的空间上拿走下一个4k的内存页,直到当前的32k被用完,此时,去向操作系统申请下一块32k大小的内存。如此循环,所以本质上我们这个要走的多少一个字节,反而有点儿没有必要。反而更重要的点在于用完了要及时把我们malloc的堆及时得free掉。比较靠谱。