malloc 在堆上分配内存,句点.
您的C库通常会保留可用内存块的列表(或更复杂的数据结构),找到一个合适的块来满足malloc(可能将更大的块拆分为多个较小的块)并将free内存返回到列表中(可能将一些较小的块合并为一个较大的块
只有当列表中没有足够大的块来满足您的需求时malloc,库才会向操作系统请求更多内存,例如使用sbrk系统调用.此系统调用返回的地址可能是虚拟地址,也可能是真实地址,具体取决于您的硬件,但作为程序员,您不能(也不需要)知道这一点.
说malloc在堆上分配虚拟地址空间而不是块就像是read从硬盘而不是从文件中读取:从调用者的角度看它是无关紧要的,并不总是如此.
至少有3种测量内存消耗的方法:
malloc 通常会影响他们.
编辑:那么,我能想到回答你问题的最佳方式就是说:
malloc分配虚拟内存.
并且虚拟内存消耗:
malloc 是在堆上分配一块内存还是应该称为虚拟地址空间?
简短回答: malloc 在堆上分配内存。
它不是足够精确的说在虚拟ADRESS [原文]空间的malloc分配内存,因为调用栈本身是同一空间的一部分。
malloc()确实在 HEAP 上分配一块内存。
它应该被称为虚拟地址空间吗?暂时保留这个想法。VAS(虚拟地址空间)是一种内存映射机制,包含应用程序的整个内存空间。也就是说,VAS并不局限于HEAP的内存区域。HEAP实际上只是它的另一部分。
每次运行新的应用程序时,操作系统都会创建一个新进程并为该应用程序分配新的VAS。通过分配的内存malloc()保留在 HEAP 上,如您所知,HEAP 是 VAS 内的一个特殊内存区域,通过标准方式分配的内存最终位于堆栈中,这是位于应用程序的 VAS 内的另一个内存区域。
要回答这个问题,我们需要知道我们正在处理什么样的操作系统和架构。正如 pmg 提到的标准和文章指的是 \xe2\x80\x9cstorage\xe2\x80\x9d 或 \xe2\x80\x9cspace\xe2\x80\x9d。这些是最通用的术语,也是唯一有效的术语,除非我们做出一堆假设。
\n\n例如:
\n\n\n\n\nmalloc 在堆上分配一块虚拟\n 地址空间
\n
这对于许多嵌入式系统来说是不正确的。其中许多不使用虚拟内存,因为不需要(没有多任务处理等)或出于性能原因。更重要的是,某些外来设备可能没有堆 \xe2\x80\x93 的概念,怀疑会使用 malloc,但公平地说,这就是标准引用 \xe2\x80\x9cstorage 的原因之一\xe2\x80\x9d - 它是特定于实现的。
\n\n另一方面,该示例对于我们 PC 中的 Window 和 Linux 是正确的。我们来分析一下来回答这个问题。
\n\n首先,我们需要定义什么是虚拟地址空间。
\n\n虚拟地址空间 (VAS) 是一种内存映射机制,有助于管理多个进程。
\n\n回到问题,\xe2\x80\x9d malloc 是在堆上分配一块内存还是应该称为虚拟地址空间?\xe2\x80\x9d
\n\n两种说法都是正确的。我宁愿说 VAP 而不是内存 \xe2\x80\x93 它更明确。有一个普遍的误解:malloc = RAM 内存。回到过去,DOS 内存分配非常简单。每当我们要求内存时,它总是 RAM,但在现代操作系统中它可能会有所不同。
\n