c语言堆找静态存储区,C语言中Code Area(代码区)/Static Area(静态区)/Stack(栈)/Heap(堆)的内存映射区块是什么?...

o为什么要说一下这个问题!

在我完成老九学堂第80节的作业时,偶然发现了这个问题

3_JHYCS9KA5TXUQ98.png

这里提示变量的声明最大为16384字节,也就是16KB,但是系统为了安全起见,单独的局部变量一般只能使用12kb的栈空间大小。

3_ZQNHRXAFGSNGC7B.png

各种内存映射区的知识

Code Area(代码区):程序代码指令、常量字符串、只可读。

Static Area(静态区):存放全局变量/常量、静态变量/常量。该区域的大小在程序一加载进内存的时候就已固定,但是静态变量的值是可以更改的。

Stack(栈):预先设定大小,自动分配与释放。(一级数据缓存(另一个是一级指令集缓存)数据临时交换,windows一般只提供1M空间的大小,数据存放在内存条中,每个函数最多16kb(CPU每次读取64字节,为了效率不要超过这个值),所以一定要即时释放内存空间,以免栈溢出)

Heap(堆):由程序员控制,使用malloc/calloc/free来操作。(二级缓存数据临时交换,数据存放在系统中的虚拟内存块,在硬盘上,速度比较慢)

单核一级数据缓存一般为32kb(栈区,一级缓存2种,一种是指令集缓存,这个是只读的.另一个就是现在说的数据缓存,都是32kb.命中率80%,缓存单个函数变量数据)

单核二级缓存一般为256kb-1024kb(堆区.命中率15%,缓存虚拟内存中将要使用的数据,)

共享三级缓存一般为;2M-16M(指单块共享缓存区,办公来说对性能提升不大,但对游戏和服务器性能提升很大.命中率5%,由于一/二级缓存容量较小,这里缓存一级和二级内存没有缓存完的栈和堆数据)

内存:缓存所有系统和程序的栈区数据

虚拟内存:主要保存堆区数据,系统断电也不会消失,在重启电脑或程序后,由系统统或程序一清理.

低指针位

3_GKRG8PTUDHH7HTM.png

高指针位(栈在堆的前面,上面这个图有误,请一定把下面的内容看完就明白了)

例子1:(func_param->函数参数)

3_XK5MHDT6M37R4WP.png

例子2:

3_2RZMC6QP5Z7U2HP.png

栈(Stack)的实现原理(windwos上除了GUI图形外,普通程序只有1M的栈区,一般不建议修改,最高可以修改至1889M空间)

3_99P46BRU3UCRQ9K.pngint abc(int a,int b){    //注意:C语言的形参是从右到左入栈的,b先入栈,a后入栈;a先出栈,b后出栈

}

因为C语言是底层语言,包括操作系统本身就是用C语言写的,所以呢,很多时候是这样的:用C语言来写一个库,再用其他语言来调用。

但是呢,不能保证所有的语言都是从右到左入栈的。所以其他语言在调用C语言写的库的时候,要遵循C语言的规范。

例子3:

3_MSKR4W3J8AX693U.png

简单理解

我们写的代码都要经过四个步骤才能得到机器读懂的“东西”(Linux和windows)

预处理:展开头文件/宏替换/去掉注释/条件编译(输出的是.i或.idb文件)

编译:检查语法,生成汇编(输出的是.s或.pdb文件)

汇编:汇编代码转换成机器码(输出的是.o或.obj文件)

链接:链接到一起生成可执行程序(输出的是.out或.exe文件)

两个问题:

1、那机器能够读得懂啥“东西”呢?

只有0/1的机器码,显然只能识别二进制文件。

2、二进制文件由啥构成的?

如图由堆、栈、全局数据区和代码段组成。

→虚拟内存高位   内存条中位   ←                      内存条低位

3_ANM4R4D4EXYG34N.png

3_N8RB5XE3N3EHCUY.png

细讲下栈(Stack)和堆(Heap),他们两个属于动态区域

栈区(Stack):先进后出。

编译器自动分配和释放的,主要存储的是函数的参数值、局部变量等值。相对较高的地址,地址值从高往低分配。例如:声明int test变量就是自动分配的空间。

由于是自动分配,速度比堆(Heap)快。

次函数调用结束后,局部变量先出栈,然后是参数出栈,最后栈顶指针指向最开始的地址。

堆区(Heap):顺序随意。(很多数据都在虚拟内存中)

由程序员编写代码去控制分配和释放,一般放的是指针。从低往高分配。例如:test=(int*)malloc(4),要记得free,不然容易内存泄漏。

速度比较慢,而且容易产生内存碎片。

堆得具体行为,整个生命周期由程序员控制释放free。

大概说下全局数据区和代码块,了解就好,他们属于静态区域。

全局数据区Static Area:

存放全局变量和静态变量

内存又分为BSS段和数据段,简单差别如下:BSS段:存放程序中未初始化的全局变量。(并不给该段的数据分配空间,仅仅是记录了数据所需空间的大小。)

数据段:存放程序中已初始化的全局变量。(为数据分配空间,数据保存在目标文件中。)

代码块(Code Area):存放函数体的二进制代码,是由操作系统进行管理的。

在代码段中,也有可能包含一些只读的常量,例如字符串常量等。

代码段大小在程序运行之前就已经确定,并且内存区域通常属于只读,某些架构中也允许代码段为可写。

总结堆栈(其他2个太容易理解了)

堆:(主要用于虚拟内存中的数据临时交换)

堆默认会使用虚拟内存(映射区)把数据先保存在硬盘上进行临时的数据交换。

优点:占用的虚拟内存空间,空间可以无限大.在liunx小内存64Mb系统中,使用堆可以有效节省内存空间,可以流畅运行.

缺点:运行速度相对栈较慢,而且堆主要采用链表的方式创建空间,是一块一块的碎片空间,所以非常的损伤硬盘寿命.

栈:

1:windows系统上,正常使用的栈空间只有设定的栈空间大小的90%(准确是91%).我们设定栈空间为100mb,那我们所能使用的栈安全空间为90mb.

2:windows系统上,常用栈空间大小为1Mb,最大值可调整为1.84Gb(1889Mb)(以系统为8G测试出来的)

3_DTNUV32P5DHNCPP.gif

3:windows系统上,单独函数所使用的栈空间最大为16kb,最小为4b.

3_H9V25SYTNNA2TY8.png

【你乐科技版权】站内所发布的一切原创内容,转载请说明是由《你乐科技》发布,内容仅限用于学习和研究,不得用于商业或非法用途,否则,一切后果请用户自负。本站信息部分来自网络,版权争议与本站无关。您必须在下载后的24小时内,彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

邮箱地址:nilekeji@163.com

最后于 9月前

被酷乐Happy编辑

,原因:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值