动态内存分配在哪里?

时间:2010-08-13 04:31:40

标签: c++ c dynamic-memory-allocation

在接受采访时我问了这个问题,答案是“计算机记忆”。但到底在哪里......?它是随机存取存储器还是硬盘驱动器?

5 个答案:

答案 0 :(得分:7)

他们可能正在寻找“堆”。这是一个与“堆栈”分开的内存区域,它是存储所有局部变量,参数,返回值等的地方。是的,它全部在RAM中,而不是在硬盘上。

答案 1 :(得分:4)

动态分配的内存是从内存中分配的,通​​常称为“堆”。

在C ++中,我们确实有两个“堆”(认为它们可能(或可能不)在技术上是同一个区域)。 malloc()(和family)分配的内存来自“堆”,而new(和family)分配的内存来自“free store”。

请注意,“堆”和“免费商店”都是计算机科学“堆”特定实例的绰号。

语言定义没有定义留给实现定义的“堆”或“免费存储”的含义。此外,操作系统将在内存页面发生的情况中发挥作用,但这超出了大多数应用程序的范围。

在计算机科学中,术语“堆栈”被用作简单的教学工具。它定义了一个用于跟踪函数调用的内存区域,它与“堆”不同。在现代操作系统中,这个定义过于简单。因此,运行时“堆栈”现在通常作为“堆”的一部分实现(这具有额外的优势,即您无需在运行时尝试跟踪堆/堆栈是否发生冲突。此外,它还用作安全预防措施因为粉碎堆栈并获得确定性结果变得更加困难)。

答案 2 :(得分:3)

  1. C ++标准没有提到与运算符新内存分配或动态内存分配相关的单词“heap”。因此,“堆”可能用于表示与自动变量的存储区域不同的存储器

  2. C ++标准在脚注中说明 - “意图是C ++的内存模型与ISO / IEC 9899编程语言C的内存模型兼容。”

  3. 当我提到C标准时,它也没有提到任何关于'堆'的内容。

  4. 总而言之,最好假设动态内存分配的实际存储未指定(行为,对于格式良好的程序构造和正确的数据,这取决于实现。)

    最后一点。

    4.重要的是要记住'placement new'不会分配任何内存。相反,它使用预分配的内存(作为参数传递给它)来构造对象。

答案 3 :(得分:2)

在现代PC,工作站或服务器机器上,答案为“它是随机存取存储器还是硬盘驱动器?”是:既不。它分配在虚拟内存中。当它第一次被分配时,给你的虚拟地址可能没有任何物理存在。在第一次访问时,它将在RAM中进行物理实例化,但如果其他用途需要RAM,则可能稍后将其移动到磁盘或其他交换设备上的存储中。在随后尝试访问它时,它将再次移回RAM。

这只是虚拟内存的非常基本的解释。如果您真的想了解,请阅读Wikipedia或Google上的一些文章。

答案 4 :(得分:1)

简要总结 - 一个单词的答案可能是'堆'。但是,所谓的堆栈或堆原来是依赖于上下文的。例如,

请参阅Intel Programming Guide,第6.2节中的Stack。 'SS'是堆栈段,它提供连续的地址空间。当你调用一个函数时,它的返回地址,传递的参数和局部变量都在这个段上分配 - 称为“堆栈”。如果你有一个指针变量(比如char * p),那么这个变量在堆栈上分配,但是当在C上调用malloc()或'new'时分配内存,在数据段上分配C ++(DS)另外,请参阅stanford tutorials。因此,现在处理器必须进行地址转换 - 检查地址是否在进程内,而不是仅仅将SS中的堆栈顶部递增到下一个内存地址。地址范围,将虚拟地址拆分为Segment + Offset,以获取特定地址的值。

因此,在这里讨论'Stack'和'Heap'与处理器架构密切相关 - 当我们处理像C,C ++这样的语言时。

对于Java,一切都在堆上完成 - 这是所有Java进程的公共存储区域 - JVM spec (参见第3.5和3.6节)说每个JVM线程都有自己的私有堆栈 - 存储堆栈帧 - 由传递的参数,局部变量等组成。最重要的是,这些堆栈帧可以从堆分配 - 并且不需要顺序寻址。除此之外,java还提供了类似C的本机方法堆栈。

但是,我在面试环境中猜测,最好说“堆” - 并且只考虑如果要求进行详细说明。