c语言代码存放的区域 堆栈,C语言内存四区(示例代码)

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

71c4eb0e915c4de7b8690f5a3f2f8b26.jpg

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

2d21efb3dcc449b8b0fb1c1532d81972.jpg

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

c7c954d609a346d3ba976947214d6c49.jpg

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

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

堆是一块很大的区域,通常情况下是4G的大小,(这个数字通常情况下是虚拟的,但是可以利用现代操作系统来利用硬盘模拟出来这么一块儿空间,因为我们随便开几个程序这就一下把内存撑死了。所以这个4G是一个虚拟的情况,我们编程的时候就考虑这是一个4G的很大空间就可以了,然后 要记得自己分配的空间及时还回去。)

栈,栈对于不同的操作系统来讲,其大小不固定,有大有小,通常情况下在4k或者8k左右,64k就顶天了。但是 不同的是:栈对于一个线程来讲,就有一个栈,如果一个进程有4个线程,那么这个 线程区域就有4个栈。

a47e382c468646f5a97194fe2fb9a42f.jpg

对于整个分配过程来讲,可以看到我们是从地址的高位开始往下分配了静态区域,代码区域,堆,栈,所以可以想见:对于里面的每一个东西来讲,分配都是从上到下的

342c9a3568ba45cbbfb1dfe1f6cd4fe2.jpg

根据这个结果来分析一下对于内存的分配关系:

2d3cedad618849daba4d2829bd332ad1.jpg

堆这里不太敢说,但是对于栈来讲,先进后出,从下面入,下面出。

并且它的释放是按照,代码块儿的形式释放的,按照取地址的方式取得具体的某一个数字的值的。

938e77fa158e4e66a6ab197e85e2db2c.jpg

e9800e39ff574fcfbf01a60b6f582f7d.jpg

我们的验证结果跟这个图还是基本一致的,除了 静态区和代码区多少有点出入以外。栈的上面是栈底,我们一行一行往里面写数据,然后在释放数据。堆里面不断地开辟空间,进行使用。想到了之前我们说的。在windows里面内存使用的大端对齐,拿我们的程序的高位对内存的低位。而对于某些大型服务器的系统来讲,是小端对齐。拿程序的低位对应内存的低位。

bb16566de3fd4b558ad812f61ffe276f.jpg

既然知道了内存的分配,那么希望我们所写的代码尽量少的使用内存。

所以在编程的时候:这样写:Char[9].总感觉比Char[10]要省一个字节。那么真的如此么?

014990b8af2740eb86dd4ee96e627226.jpg

于是跑了一段这样的代码:

我的系统得到的结果是每次都会增加4k。

按照视频的讲解的思路就是:当我们的程序在malloc的时候,都会开辟32k大小的一块空间,每32k上面有4k大小的内存页,我们申请了一段内存,就先可着头一个4k大小的内存页使,当用完当前这个内存页之后,从32k的空间上拿走下一个4k的内存页,直到当前的32k被用完,此时,去向操作系统申请下一块32k大小的内存。如此循环,所以本质上我们这个要走的多少一个字节,反而有点儿没有必要。反而更重要的点在于用完了要及时把我们malloc的堆及时得free掉。比较靠谱。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值