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++语言   中图分类号:TP312 文献标志码:A 文章编号:1006-8228(2014)05-44-03   Abstract: The memory allocation strategy C++ compiler is described in detail in this paper. The distribution strategy of heap, stack, literals memory, register memory in C++ language is given. The causes and the solution of memory allocation problems and program running error are analyzed to avoid exception and memory errors, and guarantee the correctness and robustness of program.   Key words: memory; heap; stack; C++ language   0 引言   C++编译器根据数据在内存中的生存期不同,将用户使用的内存分为程序区、静态存储区和动态存储区三个区域,其中动态存储区又分为堆区、栈区和寄存器区。   1 内存分配形式   C++中内存分配形式有以下六种。   1.1 栈区(stack)   栈由编译器自动分配及释放,用于存放函数参数值,局部变量值等。栈是一块连续的内存区域,它的大小为2M固定常数,因此程序中的变量能从栈中获取空间较少。若栈的剩余空间大于所申请空间,编译器将为程序提供栈空间,且按照向低地址生长方向分配连续的内存空间;若申请的空间超过栈的剩余空间,将报异常,提示栈溢出(overflow)[1]。   在调用函数时,第一个进栈的是被调用函数下一行的内存地址,再是函数参数,参数入栈的顺序自右向左,再是函数的局部变量。函数调用结束后,首先出栈的是被调函数中的局部变量,再是参数,次序是自左向右,所有变量和参数都出栈后,栈顶指针指到调用函数的下一行内存地址,程序根据该地址跳转到函数调用处的下一行自动执行。入栈数据的内存地址随着入栈顺序的先后向着内存地址减小的方向增长,随着数据不断入栈,内存地址不断变小。由于栈的先进后出原则,栈不会产生内存碎片。虽然栈内存小,但效率高,栈中存储的数据只在函数内有效,函数调用结束会因为数据出栈而被释放。   1.2 堆区(heap)   堆内存由程序员分配及释放,若程序员在程序中未释放,则在程序运行结束后,由操作系统回收。堆是不连续的空闲内存区域,各块区域由链表连接起来,其内存大小由系统中虚拟内存来确定,因此其空间较大,可以存放大量数据。   堆区分配内存空间时,系统会遍历用于记录内存空闲块的链表,首次找到一个空间大于所申请空间的堆结点时,将该结点从链表中删除。并将该结点的内存分配给程序,同时在这块内存区域首地址处记录本次内存分配大小,程序员在用delete或free释放内存时,以此识别要删除内存大小并正确删除该段内存。若申请的内存空间与堆结点上的内存空间不相等,则系统会自动将堆结点上多余内存空间回收到空闲链表中。堆区在分配内存时,链表中地址遍历方向是由低向高,因此堆区分配内存时是按照向高地址生长的方向分配不连续内存空间[1]。堆内存分配是由程序员进行分配及释放,速度较慢,易产生内存碎片。   堆是不连续的内存区域,由链表将其串接起来的空闲块,其不能像栈一样可以为其中的某个存储单元命名,堆中的每个内存单元都是匿名的,对堆的访问只能先在堆中申请内存,再把申请内存的首地址保存在一个指针中,再通过指针来访问内存。在C++中用malloc()和new关键字申请堆内存。寄存器区一般用于保存栈顶指针和指令指针。   1.4 静态区(static)   全局变量和静态变量的存储是放在一块的,已初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和静态变量存放于相邻的另一块区域,内存在程序结束后由系统释放。静态变量的空间在程序编译阶段进行分配,所分配内存在程序整个运行期间都存在[2]。   1.6 程序代码区   存放函数体的二进制代码。   2 内存分配中若干问题的分析   如果对内存分配策略理解不清楚,且程序设计不当,就极易引起对运

文档评论(0)

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

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

1亿VIP精品文档

相关文档