Sri*_*ian 2 c++ windows visual-c++
我想预分配一大块内存,比如说1gb来实现一个内存池。Virtual Alloc使用4kb的页面大小进行分配。在这种情况下,使用virtualalloc而不是new有什么好处?在这种情况下不应该使用new,还是使用new而不是virtual alloc有任何缺点?
使用VirtualAlloc,您可以保留1gb地址范围。稍后,您可以按需提交它的一部分-以便为给定的保留地址块分配实际的物理内存块。保留永远不会失败,而如果物理内存不足,则提交可能会失败。实际上,在Windows上使用页面文件时,这也应该总是成功。
new将保留并提交1gb块。
因此,如果您需要即时访问整个1GB块,请继续使用new。
如果您从一开始就不需要访问整个1GB的块,并且可以编写算法以使它可以按需提交部分内存,则VirtualAlloc可以优化您的内存消耗。
如果您考虑将VirtualAlloc用于您的目的,那么您可能会发现很难决定何时以及如何提交内存。我在Jeffrey Richter的书(Advanced Windows 3rd ed。)中找到的一种不错的方法是使用结构化异常处理。一旦您的代码触及了未提交的内存异常,您要做的就是捕获它,提交内存,然后告诉系统重试该指令在发生问题的地方。我从没有尝试过,但是据我所知,这就是堆栈的实际工作方式。