c++ - 何时使用 VirtualAlloc 与 new?

标签 c++ windows visual-c++

<分区>

Possible Duplicate:
What's the differences between VirtualAlloc and HeapAlloc?

我想预分配一大块内存,比如 1gb 来实现内存池。 Virtual Alloc 使用 4kb 的页面大小进行分配。在这种情况下使用 virtualalloc 相对于 new 有什么优势?这种情况下不应使用 new 还是使用 new 而不是虚拟分配有任何缺点?

最佳答案

使用 VirtualAlloc,您可以保留 1gb 地址范围。稍后您可以按需提交它的一部分——以便为给定的保留地址 block 分配实际的物理内存块。保留应该永远不会失败,而如果物理内存不足,提交可能会失败。实际上,对于 Windows 上的分页文件,这也应该总是成功的。

new 将保留并提交 1gb block 。

因此,如果您需要即时访问整个 1GB block ,请继续使用新的。

如果您一开始不需要访问整个 1GB block ,并且您可以编写算法以便它按需提交部分内存,那么 VirtualAlloc 可以优化您的内存消耗。

如果您考虑将 VirtualAlloc 用于您的目的,那么您可能会发现很难决定何时以及如何提交内存。我在 Jeffrey Richter 的书(高级 Windows 第 3 版)中找到的一种好方法是使用结构化异常处理。一旦您的代码触及未提交的内存异常被抛出,您所要做的就是捕获它,提交内存,然后告诉系统重试发生问题的指令。我从未尝试过这个,但据我所知,这就是堆栈的实际工作方式。

关于c++ - 何时使用 VirtualAlloc 与 new?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10160323/

相关文章:

c++ - 重载 C++ 模板类虚函数

c++ - 满足条件的多种类型的模板类特化

c++ - 为什么允许这种 C++ 类型推导

java - DBUnit 测试给出了 MariaDB 的 NoSuchColumnException

visual-c++ - google::protobuf::io::FileOutputStream 未定义?

c++ - 使用STL方法在c++中对多维数组进行排序

c++ - 如何根据windows版本正确加载GetMappedFileName

c++ - 在 Windows 上生成硬件 ID

c++ - 使用默认参数 boost list_of

python - 如何将类成员方法的参数列表自动填充到可变参数中?