码迷,mamicode.com
首页 > 编程语言 > 详细

C语言内存四区

时间:2016-03-02 23:33:31      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:

按照老版操作系统来学习,内存对于程序来讲分四区。分别是 代码区,静态区,栈,堆。

技术分享

由上面程序执行的结果可知:

技术分享

貌似结果就是 静态代码堆栈

 

技术分享

静态区存放的是程序中所有静态变量和常量的值。静态区的大小是程序加载到内存之后就固定的,不会再发生改变。

代码区中存放的是程序中的代码,不能修改它的值,只能通过指针或者变量名来使用函数。【当然强行修改是被允许的但是可能发生未知错误。】

堆是一块很大的区域,通常情况下是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掉。比较靠谱。

C语言内存四区

标签:

原文地址:http://www.cnblogs.com/letben/p/5236674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!