Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 何时使用VirtualAlloc Vs new?_C++_Windows_Visual C++ - Fatal编程技术网

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
是特定操作系统的一部分。