VirtualAlloc/Ex 分配啥样的内存

Posted

技术标签:

【中文标题】VirtualAlloc/Ex 分配啥样的内存【英文标题】:What kind of memory does VirtualAlloc/Ex allocateVirtualAlloc/Ex 分配什么样的内存 【发布时间】:2018-05-24 17:02:50 【问题描述】:

我知道 C/C++ 风格的程序有内存部分、堆栈、堆、.text 等。但是当我使用 VirtualAlloc 时,它从哪里分配内存?我不认为是堆,因为我可以使用 HeapAlloc。

建议将不胜感激!

【问题讨论】:

在虚拟地址空间中,这就是为什么它以virtual开头。请参阅VirtualAlloc documentation。 谢谢!最后一件事。如果我要分配大量内存来存储数据文件,我应该使用 VirtualAlloc 还是应该使用堆来代替? 非常大 == 虚拟。在现代操作系统(包括 Windows)上,它几乎(双关语)是无限的。 哈哈,好的,谢谢! 在 Windows 上,进程中的所有内存都是虚拟内存。在 C++ 中,堆栈(自动)和堆(动态)内存只是进程虚拟内存的子集。有关详细信息,请参阅 MSDN 上的 Thread Stack Size、Comparing Memory Allocation Methods 和 Managing Virtual Memory。 【参考方案1】:

堆内存驻留在您的程序虚拟内存中,由 VirtualAlloc 在后台分配。但是,问题在于 VirtualAlloc 仅在称为页面的大块中分配内存,这使得它无法用于一般的内存分配。

因此,HeapAlloc 管理已分配的页面,并且可以将多个分配连接到一个页面中,这样您就不必为每个小分配分配整个页面(通常为 4KB,但这不是规则)。

【讨论】:

【参考方案2】:

这是不正确的:

我知道 C/C++ 风格的程序有内存部分、堆栈、堆、.text 等。

此类部分仅通过系统系统上的链接和其他系统上的加载而退出。此上下文中的部分仅说明如何在内存中对应用程序的各个部分进行分组。当你的程序运行时,它只有内存。

像 VirtualAlloc 这样的函数只是将页面分配给进程。

【讨论】:

以上是关于VirtualAlloc/Ex 分配啥样的内存的主要内容,如果未能解决你的问题,请参考以下文章

Windows 进程的内存映射是啥样的?

std::vector 在内存中是啥样的?

操作系统是用啥样的 C 语言编写的?

EVE配置要求高么,要啥样的配置

为啥要用kafka?kafka适用啥样的场景?

我想给电脑装个LINUX系统,电脑需要啥样的配置。LINUX最大支持多大内存。