Windows内存分配

Windows下的程序申请内存的方式有四种:栈、堆、虚拟内存、内存映射文件。


栈:每个线程都有自己的栈。局部变量在栈中分配,分配和释放的速度是最快的。栈的默认大小为1M(Linux下默认为8M,代码移植的时候要注意栈的大小),可以通过指定CreateThread的cbStackSize参数或链接器的/STACK开关来重新分配栈的大小,取两者中较大的一个。若代码中有无限递归,很容易出现栈溢出的情况,栈溢出后可能会破坏进程中其他线程的内存。


堆:一个进程拥有一个堆,供所有的线程共享,所以在堆上申请内存存在同步的问题。在堆上申请内存,不存在分配粒度和页面边界的问题,但分配和释放的速度比其他方式慢。默认情况下,进程堆得大小是1M,可以通过链接器的开关/HEAP来改变对的大小。C++中的new和delete就是在堆上申请内存。当申请的内存的大小大于1M时应该避免使用堆函数,而使用VirtualAlloc函数在虚拟内存上申请内存。


虚拟内存:虚拟内存有一个预定和调拨的过程。虚拟内存可以分配很大,但要按照分配粒度来分配。具体我并没有用过。


内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一个机器上运行的多个进程间共享数据(共享内存)。对于前者,就是以磁盘文件为后备存储器的内存映射文件,当需要操作的文件的大小超出机器的内存时,用内存映射文件来管理是最好的方法。我们仍然可以把这个大文件当成一个正常的文件来处理,系统会帮我们做剩下的工作。过程中用到的函数主要有CreateFile、CreateFileOfMapping、MapViewOfFile、UnmapViewOfFile等。对于后者,就是我们常用的共享内存。是以页交换文件为后备存储器的内存映射文件。当系统销毁内存映射文件对象的时候,所有写到文件映射对象的物理存储器(页交换文件)中的数据也会一起被销毁,这也是共享内存的特点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值