堆和栈在C++编程中区别详解.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
堆和栈在C编程中区别详解

堆和栈在C++编程中区别详解   摘要:在日常使用中,我们经常会把C/C++编程中的堆和栈合称为堆栈,但实际上,堆和栈虽然同处于内存的动态存储区,却是有着完全不同的分配方式。本文对此进行深入的分析,以期从根本上区分这两个不同的概念。 关键词:C++编程 堆 栈 中图分类号:TP313 引言 在c++编程中,内存的分配和使用非常方便,其中堆和栈就是两种最常用的内存管理方式:堆是进程的全局数据内存存储区;栈是函数的局部数据内存存储区。在日常使用中,很多人对堆和栈的概念有所混淆,给初学者产生不小的困惑,所以有必要对堆和栈进行深入的研究,从根本上区分这两个不同的概念。 一、C++中五大内存分区 在C++中,内存分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 堆,就是那些由new分配的内存块,它们的释放并非由编译器负责,而是由应用程序来控制的。一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。其中的变量通常是局部变量、函数参数等。 自由存储区是由malloc等分配的内存块,它和堆十分相似,区别在于它是用free来结束自己的生命的。 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,它们共同占用同一块内存区。 常量存储区,这是一块比较特殊的存储区,它们里面存放的是常量,不允许修改。 二、正确理解“堆”和“栈” 在c/c++中我们常提到堆栈,其实堆和栈是不同的存储空间。一般,c/c++编译的程序占用的内存可分为:程序代码区,静态存储区和动态存储区。堆和栈都位于动态存储区,但二者有诸多不同。栈空间是静态分配的,如:函数的参数、局部变量等,系统会根据其大小预先在栈中自动分配适当的内存空间,这一部分在其生存期内是固定不变的。而堆空间是动态分配,程序员可根据需要申请并指明大小,不用时可释放收回,如在c中用malloc()函数或在c++中用new运算符申请的空间。 另外,栈是由高地址向低地址扩展的数据结构,是一块连续的内存区域。也就是说栈的最大容量是系统预先定好的,在windows下栈的大小是2M,如果申请的空间超过栈的剩余空间,将提示0vernow!所以,能从栈获得的空间较小。而堆是一种由低地址向高地址扩展的数据结构,可以是不连续的内存空间。堆的大小只受限于计算机系统中有效的虚拟内存大小。由此可见,堆的空间比较灵活,也比较大。 三、堆和栈具体区别详解 1、内存分配方式 对于栈来讲,是由编译器自动管理。由系统自动分配,无需程序员手工控制。 对于堆来说。需要程序员自己进行申请,并指明大小,而释放工作同样也由程序员控制,容易产生内存泄漏。 2、申请效率的比较 栈:栈由系统自动分配,速度较快。但程序员是无法控制的。只要栈的剩余空间大于所申请空间。系统将立即为程序提供内存,否则将报异常,提示栈溢出。 堆:堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片。不过用起来最方便。 操作系统有一个记录空闲内存地址的链表.当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除。并将该结点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小。这样,代码中的delete语句才能正确的释放本内存空间。当然,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 另外,在Windows下,最好的方式是用VirtualAlloc分配内存,它不是在堆,也不是在栈,而是直接在进程的地址空间中保留一块内存地址.只有在调用VirtualLock之后,才在堆内存中分配实际的内存。这样的方式,虽然用起来最不方便,但是速度快,也最灵活。 3、申请大小的限制 栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在Windows下,栈的大小是2M,如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。 堆:堆是向高地址扩展的数据结构.是不连续的内存区域。由于系统是用链表来存储空闲的内存地址,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见。堆获得的空间

文档评论(0)

docman126 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7042123103000003

1亿VIP精品文档

相关文档