网站大量收购独家精品文档,联系QQ:2885784924

转载 堆与栈的区别二.docVIP

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

转载 堆和栈的区别二 原文地址:堆和栈的区别二作者:阿买基础知识: 堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称为入栈和出栈。有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈操作,PUSH指令实现入栈操作。CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。 参考:《Windows下的HEAP溢出及其利用》by:isno 《windows核心编程》by:Jeffrey Richter 摘要:讨论常见的堆性能问题以及如何防范它们。(共9页) 前言 您是否是动态分配的C/C++对象忠实且幸运的用户?您是否在模块间的往返通信中频繁地使用了自动化?您的程序是否因堆分配而运行起来很慢?不仅仅您遇到这样的问题。几乎所有项目迟早都会遇到堆问题。大家都想说,我的代码真正好,只是堆太慢。那只是部分正确。更深入理解堆及其用法、以及会发生什么问题,是很有用的。 什么是堆? (如果您已经知道什么是堆,可以跳到什么是常见的堆性能问题?部分) 在程序中,使用堆来动态分配和释放对象。在下列情况下,调用堆操作: 事先不知道程序所需对象的数量和大小。 对象太大而不适合堆栈分配程序。 堆使用了在运行时分配给代码和堆栈的内存之外的部分内存。下图给出了堆分配程序的不同层。 GlobalAlloc/GlobalFree:Microsoft Win32堆调用,这些调用直接与每个进程的默认堆进行对话。 LocalAlloc/LocalFree:Win32堆调用(为了与Microsoft Windows NT兼容),这些调用直接与每个进程的默认堆进行对话。 COM的IMalloc分配程序(或CoTaskMemAlloc/CoTaskMemFree):函数使用每个进程的默认堆。自动化程序使用组件对象模型(COM)的分配程序,而申请的程序使用每个进程堆。 C/C++运行时(CRT)分配程序:提供了malloc()和free()以及new和delete操作符。如Microsoft Visual Basic和Java等语言也提供了新的操作符并使用垃圾收集来代替堆。CRT创建自己的私有堆,驻留在Win32堆的顶部。 Windows NT中,Win32堆是Windows NT运行时分配程序周围的薄层。所有API转发它们的请求给NTDLL。 Windows NT运行时分配程序提供Windows NT内的核心堆分配程序。它由具有128个大小从8到1,024字节的空闲列表的前端分配程序组成。后端分配程序使用虚拟内存来保留和提交页。 在图表的底部是虚拟内存分配程序,操作系统使用它来保留和提交页。所有分配程序使用虚拟内存进行数据的存取。 分配和释放块不就那么简单吗?为何花费这么长时间? 堆实现的注意事项 传统上,操作系统和运行时库是与堆的实现共存的。在一个进程的开始,操作系统创建一个默认堆,叫做进程堆。如果没有其他堆可使用,则块的分配使用进程堆。语言运行时也能在进程内创建单独的堆。(例如,C运行时创建它自己的堆。)除这些专用的堆外,应用程序或许多已载入的动态链接库(DLL)之一可以创建和使用单独的堆。Win32提供一整套API来创建和使用私有堆。有关堆函数(英文)的详尽指导,请参见MSDN。 当应用程序或DLL创建私有堆时,这些堆存在于进程空间,并且在进程内是可访问的。从给定堆分配的数据将在同一个堆上释放。(不能从一个堆分配而在另一个堆释放。) 在所有虚拟内存系统中,堆驻留在操作系统的虚拟内存管理器的顶部。语言运行时堆也驻留在虚拟内存顶部。某些情况下,这些堆是操作系统堆中的层,而语言运行时堆则通过大块的分配来执行自己的内存管理。不使用操作系统堆,而使用虚拟内存函数更利于堆的分配和块的使用。 典型的堆实现由前、后端分配程序组成。前端分配程序维持固定大小块的空闲列表。对于一次分配调用,堆尝试从前端列表找到一个自由块。如果失败,堆被迫从后端(保留和提交虚拟内存)分配一个大块来满足请求。通用的实现有每块分配的开销,这将耗费执行周期,也减少了可使用的存储空间。 Knowledge Base文章Q10758,用calloc()和malloc()管理内存(有哪些信誉好的足球投注网站文章编号),包含了有关这些主题的更多背景知识。另外,有关堆实现和设计的详细讨论也可在下列著作中找到:Dynamic Storage Allocation:A Survey and Critical Review,作者Paul R.Wilson、Mark S.Jo

文档评论(0)

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

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

1亿VIP精品文档

相关文档