C++ 何时使用VirtualAlloc Vs new?
可能重复:C++ 何时使用VirtualAlloc Vs new?,c++,windows,visual-c++,C++,Windows,Visual C++,可能重复: 我想预先分配一大块内存,比如1gb,以实现内存池。虚拟Alloc使用4kb的页面大小进行分配。在这种情况下,使用virtualalloc比使用new有什么优势?在这种情况下不应该使用new,或者使用new over VirtualAlloc有任何缺点吗?对于VirtualAlloc,您可以保留1gb的地址范围。稍后,您可以按需提交部分内容,以便为给定的保留地址块分配实际的物理内存块。保留永远不会失败,而如果物理内存不足,提交可能会失败。实际上,对于windows上的分页文件,这也应
我想预先分配一大块内存,比如1gb,以实现内存池。虚拟Alloc使用4kb的页面大小进行分配。在这种情况下,使用virtualalloc比使用new有什么优势?在这种情况下不应该使用new,或者使用new over VirtualAlloc有任何缺点吗?对于VirtualAlloc,您可以保留1gb的地址范围。稍后,您可以按需提交部分内容,以便为给定的保留地址块分配实际的物理内存块。保留永远不会失败,而如果物理内存不足,提交可能会失败。实际上,对于windows上的分页文件,这也应该总是成功的 new将保留并提交1gb块 所以,如果您需要即时访问整个1GB块,那么就使用新的 如果一开始就不需要访问整个1GB块,并且可以编写算法,以便它可以按需提交部分内存,那么VirtualAlloc可以优化内存消耗
如果您将考虑使用ValualAutoC用于您的目的,那么您可能很难决定何时和如何提交内存。我在Jeffrey Richter的书(Advanced Windows第三版)中发现的一个好方法是使用结构化异常处理。一旦您的代码遇到抛出的未限制内存异常,您所要做的就是捕获它,提交内存,然后告诉系统在出现问题的地方重试指令。我从未尝试过这种方法,但据我所知,堆栈实际上就是这样工作的。
复制如果分配大块内存,并在页面边界上对齐它是一种优势,我打赌new
也会这样做。一个区别是,new
是语言的一部分,VirtualAlloc
是特定操作系统的一部分。