c++的new和VirtualAlloc有些分不清
new是从堆中申请内存
VirtualAlloc是直接从虚拟内存里面拿。
这里我就糊涂了。
new从堆里面申请的内存也属于虚拟内存的管理范畴吗?
我的意思就是说。
1,如果ram只有256m,swap有1g。
我new一个300m的内存,多出的部分内存也会从swap里面申请吗,还是直接抛出异常说内存不足?
2,这两者用起来有何特点,貌似书只是说,new是小数据用,virtualalloc是给大数据结构用的。不理解
[解决办法]
new 只要你系统的内存还够用,都是在内存里的,不够的话 依标准会抛异常
操作系统如果发现物理内存不够用,会将部分内存调到硬盘上,使用的时候再调回来(换页)
virtualalloc 分配的则统统先保存到硬盘上,使用的时候调入内存
[解决办法]
vc的new最后走的是HeapAlloc(RtlAllocateHeap)
如果堆的空间还够就在用户模式从里面划分一块给你,否则调用NtAllocateVirtualMemory分配一块虚拟内存并入堆中
[解决办法]
实际上new调的malloc,Windows上malloc调的HeapAlloc,HeapAlloc最后调的VirtualAlloc。
VirtualAlloc只能以比较大的单位(最小4KB)申请内存。HeapAlloc可以申请任意大小的内存。malloc基本上可以视为直接调用HeapAlloc(只是基本上)。new在调用malloc之后,如果是类会调用构造函数。