windows的内存内存管理函比较
2006-11-24 16:01
239 查看
GlobalAlloc/LocalAlloc:
在16位Windows中是有区别的,因为在16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局堆,而系统又为每个实例从全局堆中分配了一个64kb的数据段作为该实例的局部堆,用来存放应用程序的堆栈和所有全局或静态变量。而LocalAlloc/GlobalAlloc就是分别用于在局部堆或全局堆中分配内存.由于每个进程的局部堆很小,所以在局部堆中分配内存会受到空间的限制。但这个堆是每个进程私有的,相对而言分配数据较安全,数据访问出错不至于影响到整个系统。而在全局堆中分配的内存是为各个进程共享的,每个进程只要拥有这个内存块的句柄都可以访问这块内存,但是每个全局内存空间需要额外的内存开销,造成分配浪费。而且一旦发生严重错误,可能会影响到整个系统的稳定。不过在Win32中,每个进程都只拥有一个省缺的私有堆,它只能被当前进程访问。应用程序也不可能直接访问系统内存。所以在Win32中全局堆和局部堆都指向进程的省缺堆。用LocalAlloc/GlobalAlloc分配内存没有任何区别。甚至LocalAlloc分配的内存可以被GlobalFree释放掉。所以在Win32下编程,无需注意Local和Global的区别,一般的内存分配都等效于HeapAlloc(GetProcessHeap(),...).
GlobalAlloc/HeapAllock:
GlobalAlloc是标准内存管理函数,标准内存管理函数都是操作进程的默认堆,所以这个函数是从进程的从进程的默认堆中分配内存空间,分配的空间可以是可移动的也可以是不可以移动的。可移动的内存是指windows在需要的时候可以将这个内存移动到另外一个地址 .
HeapAllock是堆管理函数,堆管理函数可以操作非默认堆(当然也可以操作默认堆),创建一个堆是用HeapCreate,这个函数返回一个堆句柄,然后可以用在HeapAllock函数中,即从返回的这个堆中申请内存空间,HeapAllock申请的内存只能是不可以移动的
而new则是c++的标准函数,在windows的vc++编译器中,new在申请内存最终调用的是GlabalAllock,不过new还会调用类的构造函数。
windows的内存管理除了标准内存管理函数和堆管理函数之外,还有更加底层的虚拟内存管理函数,VirtualAllock就是一个虚拟内存管理函数。
在16位Windows中是有区别的,因为在16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局堆,而系统又为每个实例从全局堆中分配了一个64kb的数据段作为该实例的局部堆,用来存放应用程序的堆栈和所有全局或静态变量。而LocalAlloc/GlobalAlloc就是分别用于在局部堆或全局堆中分配内存.由于每个进程的局部堆很小,所以在局部堆中分配内存会受到空间的限制。但这个堆是每个进程私有的,相对而言分配数据较安全,数据访问出错不至于影响到整个系统。而在全局堆中分配的内存是为各个进程共享的,每个进程只要拥有这个内存块的句柄都可以访问这块内存,但是每个全局内存空间需要额外的内存开销,造成分配浪费。而且一旦发生严重错误,可能会影响到整个系统的稳定。不过在Win32中,每个进程都只拥有一个省缺的私有堆,它只能被当前进程访问。应用程序也不可能直接访问系统内存。所以在Win32中全局堆和局部堆都指向进程的省缺堆。用LocalAlloc/GlobalAlloc分配内存没有任何区别。甚至LocalAlloc分配的内存可以被GlobalFree释放掉。所以在Win32下编程,无需注意Local和Global的区别,一般的内存分配都等效于HeapAlloc(GetProcessHeap(),...).
GlobalAlloc/HeapAllock:
GlobalAlloc是标准内存管理函数,标准内存管理函数都是操作进程的默认堆,所以这个函数是从进程的从进程的默认堆中分配内存空间,分配的空间可以是可移动的也可以是不可以移动的。可移动的内存是指windows在需要的时候可以将这个内存移动到另外一个地址 .
HeapAllock是堆管理函数,堆管理函数可以操作非默认堆(当然也可以操作默认堆),创建一个堆是用HeapCreate,这个函数返回一个堆句柄,然后可以用在HeapAllock函数中,即从返回的这个堆中申请内存空间,HeapAllock申请的内存只能是不可以移动的
而new则是c++的标准函数,在windows的vc++编译器中,new在申请内存最终调用的是GlabalAllock,不过new还会调用类的构造函数。
windows的内存管理除了标准内存管理函数和堆管理函数之外,还有更加底层的虚拟内存管理函数,VirtualAllock就是一个虚拟内存管理函数。
相关文章推荐
- windows内存分配函数比较
- Windows内存小结(有好多图,比较清楚)
- Windows下的weblogic部署web项目运行比较慢或内存溢出,需要调整内存大小
- 【Windows】vs内存泄露检测方法
- TSX之有限事务内存,TSX之锁消除技术 和 lock free 编程之比较(有效总结)
- linux及windows程序内存分布
- Loadrunner 监控Windows资源(CPU、内存)使用情况
- 《Windowss核心编程》之八 - Windows内存结构
- Windows内存心得
- 20170805Windows12_4_获取系统内存大小及空间内存
- Windows下用C语言获取系统的CPU利用率、内存使用率、硬盘使用率等-转载
- HashMap与ConcurrentHashMap的内存占用与get操作性能比较
- Windows内存管理机制及C++内存分配实例
- windows下使用memcache并修改memcache最大使用内存
- Windows进程通信 -- 共享内存
- java中一个汉字和一个字母所占内存字节比较以及后台验证的减半处理
- 电池比较的黑莓,Android,苹果和Windows智能手机
- 全面介绍Windows内存管理机制及C++内存分配实例
- Windows进程间通信-共享内存
- 团灭Windows进程通信(三)——共享内存就是方便面