aurain
技术文摘
posts - 137,  comments - 268,  trackbacks - 0

摘自《C++应用程序性能优化》

Win32平台下,可以通过如下5组函数来使用内存(申请和释放操作等)

1. 传统的CRT函数(malloc/free系列),因为这组函数的平台无关性,如果程序会被移植到其它非Windows平台,则这组函数是首选。

2. global heap/local heap函数(GlobalAlloc/LocalAlloc系列),这组函数是为了向后兼容而保留的。在Windows 3.1平台下, global heap为系统中所有进程共有的堆,这些进程包括系统进程和用户进程。它们对此global heap内存的申请会交错在一起,从而使得一个用户进程的不小心的内存使用错误会导致整个操作系统的崩溃。local heap又被称为“private heap”,与global heap相对应,local heap为每个进程私有。进程通过LocalAlloc从自己的local heap里申请内存,而不会相互干扰。除此之外,进程不能通过另外的用户自定义堆或者其它方式动态的申请内存。到了Win32平台,由于考虑到安全因素,global heap已经废弃,local heap也改名为“process heap”。为了使得以前针对Windows 3.1平台写的应用程序能够运行在新的Win32平台上,GlobalAlloc/LocalAlloc系列函数仍然得到沿用,但是这一系列函数最后都是从process heap中分配内存。不仅如此,Win32平台还允许进程除process heap之外生成和使用新的用户自定义堆,因此在Win32平台下建议不使用GlobalAlloc/LocalAlloc系列函数进行内存操作。

3. 虚拟内存函数(VirtualAlloc/VirtualFree系列),这组函数直接通过保留(reserve)和提交(commit)虚拟内存地址空间来操作内存,因此它们为开发人员提供最大的自由度,但相应的也为开发人员内存管理工作增加了更多的负担。这组函数适合于为大型连续的数据结构数组开辟空间。

4. 内存映射文件函数(CreateFileMapping/MapViewOfFile系列),系统使用内存映射文件函数系列来加载.exe或者.dll文件。而对开发人员而言,一方面通过这组函数可以方便的操作硬盘文件,而不用考虑那些繁琐的文件I/O操作;另一方面,运行在同一台机器上的多个进程可以通过内存映射文件函数来共享数据(这也是同一台机器上进程间进行数据共享和通信的最有效率和最方便的方法)。

5. 堆内存函数(HeapCreate/HeapAlloc系列),Win32平台中的每个堆都是各进程私有的,每个进程除了默认的进程堆,还可以另外创建用户自定义堆。当程序需要动态创建多个小数据结构时,堆函数系列最适合。一般来世CRT函数(malloc/free)就是基于堆内存函数实现的。

posted on 2008-08-21 10:12 阅读(2798) 评论(4)  编辑 收藏 引用 所属分类: 算法与数据结构

FeedBack:
# re: Win32内存相关API
2008-08-22 00:35 | theanswerzju
你把COM里面的内存管理给忘了哦  回复  更多评论
  
# re: Win32内存相关API
2008-08-22 09:25 |
@theanswerzju
这个主要是讨论Win32 SDK的开发方式,所以没有讨论COM了。不过,那方面我也不懂了。  回复  更多评论
  
# re: Win32内存相关API
2008-08-24 15:50 | 戴尔笔记本
个人感觉通过Win32 SDK开发方式太辛苦了。  回复  更多评论
  
# re: Win32内存相关API
2008-08-25 11:41 |
@戴尔笔记本
嗯,不过个人觉得这个是windows下开发的基础了,就像学编程一般要用学C一样,也能更清楚一些细节问题了。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(17)

随笔分类(138)

随笔档案(137)

网络开发

最新随笔

搜索

  •  

积分与排名

  • 积分 - 488932
  • 排名 - 36

最新随笔

最新评论

阅读排行榜

评论排行榜