o为什么要说一下这个问题!
在我完成老九学堂第80节的作业时,偶然发现了这个问题
这里提示变量的声明最大为16384字节,也就是16KB,但是系统为了安全起见,单独的局部变量一般只能使用12kb的栈空间大小。
各种内存映射区的知识
Code Area(代码区):程序代码指令、常量字符串、只可读。
Static Area(静态区):存放全局变量/常量、静态变量/常量。该区域的大小在程序一加载进内存的时候就已固定,但是静态变量的值是可以更改的。
Stack(栈):预先设定大小,自动分配与释放。(一级数据缓存(另一个是一级指令集缓存)数据临时交换,windows一般只提供1M空间的大小,数据存放在内存条中,每个函数最多16kb(CPU每次读取64字节,为了效率不要超过这个值),所以一定要即时释放内存空间,以免栈溢出)
Heap(堆):由程序员控制,使用malloc/calloc/free来操作。(二级缓存数据临时交换,数据存放在系统中的虚拟内存块,在硬盘上,速度比较慢)
单核一级数据缓存一般为32kb(栈区,一级缓存2种,一种是指令集缓存,这个是只读的.另一个就是现在说的数据缓存,都是32kb.命中率80%,缓存单个函数变量数据)
单核二级缓存一般为256kb-1024kb(堆区.命中率15%,缓存虚拟内存中将要使用的数据,)
共享三级缓存一般为;2M-16M(指单块共享缓存区,办公来说对性能提升不大,但对游戏和服务器性能提升很大.命中率5%,由于一/二级缓存容量较小,这里缓存一级和二级内存没有缓存完的栈和堆数据)
内存:缓存所有系统和程序的栈区数据
虚拟内存:主要保存堆区数据,系统断电也不会消失,在重启电脑或程序后,由系统统或程序一清理.
低指针位
高指针位(栈在堆的前面,上面这个图有误,请一定把下面的内容看完就明白了)
例子1:(func_param->函数参数)
例子2:
栈(Stack)的实现原理(windwos上除了GUI图形外,普通程序只有1M的栈区,一般不建议修改,最高可以修改至1889M空间)
int abc(int a,int b){ //注意:C语言的形参是从右到左入栈的,b先入栈,a后入栈;a先出栈,b后出栈
}
因为C语言是底层语言,包括操作系统本身就是用C语言写的,所以呢,很多时候是这样的:用C语言来写一个库,再用其他语言来调用。
但是呢,不能保证所有的语言都是从右到左入栈的。所以其他语言在调用C语言写的库的时候,要遵循C语言的规范。
例子3:
简单理解
我们写的代码都要经过四个步骤才能得到机器读懂的“东西”(Linux和windows)
预处理:展开头文件/宏替换/去掉注释/条件编译(输出的是.i或.idb文件)
编译:检查语法,生成汇编(输出的是.s或.pdb文件)
汇编:汇编代码转换成机器码(输出的是.o或.obj文件)
链接:链接到一起生成可执行程序(输出的是.out或.exe文件)
两个问题:
1、那机器能够读得懂啥“东西”呢?
只有0/1的机器码,显然只能识别二进制文件。
2、二进制文件由啥构成的?
如图由堆、栈、全局数据区和代码段组成。
→虚拟内存高位 内存条中位 ← 内存条低位
细讲下栈(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:windows系统上,单独函数所使用的栈空间最大为16kb,最小为4b.
【你乐科技版权】站内所发布的一切原创内容,转载请说明是由《你乐科技》发布,内容仅限用于学习和研究,不得用于商业或非法用途,否则,一切后果请用户自负。本站信息部分来自网络,版权争议与本站无关。您必须在下载后的24小时内,彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。
邮箱地址:nilekeji@163.com
最后于 9月前
被酷乐Happy编辑
,原因: