一文读懂堆栈、静态、动态内存的区别和应用(附代码).doc
《一文读懂堆栈、静态、动态内存的区别和应用(附代码).doc》由会员分享,可在线阅读,更多相关《一文读懂堆栈、静态、动态内存的区别和应用(附代码).doc(4页珍藏版)》请在三一文库上搜索。
1、一文读懂堆栈、静态、动态内存的区别和应用(附代码)预备知识程序的内存分配一个由栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆区(heap) 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放文字常量区 常量字符串就是放在这里的。程序结束后由系统释放程序代码区存放函数体
2、的二进制代码。程序在内存中通常分为程序段、数据端、堆栈三部分。程序段里放着程序的机器码、只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。堆栈是内存中的一个连续的块。一个叫堆栈指针的在高级语言中,程序函数调用、函数中的临时变量都用到堆栈。为什么呢?因为在调用一个函数时,我们需要对当前的操作进行保护,也为了函数执行后,程序可以正确的找到地方继续执行,所以参数的传递和返回值也用到了堆栈。通常对局部变量的引用是通过给出它们对SP的偏移量来实现的。另外还有一个基址指针(FP,在在函数体中定义的变量通常是在栈上,用malloc, calloc, r
3、ealloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能ex栈:栈存在于堆:堆位于RAM中,是一个通用的内存池。所有的对象都存储在堆中。heapstack【栈】: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 。heap【堆】: 需要程序员自己申请,并指明大小,在c中malloc函数 如p1 = (char *)malloc(10); 在C+中用new运算符 如p2 = (char *)malloc(10)
4、; 但是注意:p1、p2本身是在栈中的。栈【stack】:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。堆【heap】:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序;另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。4 申请大小的限制栈【stack】
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 读懂 堆栈 静态 动态 内存 区别 应用 代码
链接地址:https://www.31doc.com/p-3363304.html