物理内存中的堆和堆栈在哪里?

时间:2015-05-02 22:08:16

标签: c++ memory stack heap

我通过一些谷歌搜索关于Heap&堆栈,但大多数答案只是说它的概念描述,差异。

我很好奇其他事情。

  1. 正如标题所说,物理内存中的堆和堆栈在哪里?

  2. 他们的体型如何?例如,我在台式机上使用12千兆字节内存,那么Heap多少钱?堆栈大小是多少?

  3. 谁制作了这两种不同类型的概念?

  4. 我可以操纵Heap&堆栈的分配?如果他们每个占用50%的内存,(如果Heap占用6千兆字节内存,在我的情况下堆栈也需要6千兆字节),我可以调整它们吗?

2 个答案:

答案 0 :(得分:3)

  
      
  1. 正如标题所说,物理内存中的堆和堆栈在哪里?
  2.   

由于CPU已经MMUs在虚拟内存和物理内存之间添加了一层间接,因此堆和堆栈已经存在于物理内存中。自从现代操作系统实现ASLR以来,堆和堆栈也在虚拟内存中的任何位置。

  
      
  1. 他们的体型如何?例如,我在台式机上使用12千兆字节内存,那么Heap多少钱?堆栈大小是多少?
  2.   

从小开始,随需求增长。在Unix上,最大堆栈大小由ulimit -s设置,堆大小由ulimit -d限制。您可以使用ulimit -a在Unix操作系统上查看默认设置的限制。

  
      
  1. 谁制作了这两种不同类型的概念?
  2.   

我敢打赌这可以追溯到至少20世纪60年代。 Wikipedia has a reference from 1960.

  
      
  1. 我可以操纵Heap&堆栈的分配?如果他们每个占用50%的内存,(如果Heap占用6千兆字节内存,Stack在我的情况下也需要6千兆字节),我可以调整它们吗?
  2.   

正如已经说过的那样,他们自己调整大小,或者更确切地说,他们在操作系统和用户设定的限制内按需增长。如果您使用的是Unix和bash,请参阅ulimit的帮助。

答案 1 :(得分:1)

1。它可以无处不在。即使在物理内存之外,因为在应用方面没有这样的东西。用户土地中的所有内容都使用virtual memory,可以映射到RAM上的HDD或交换区域。这里没有一定的假设,抱歉。

2。它们都是动态增长的,差异在于速度和大小限制:

  • 通常被认为较慢。它根据应用要求进行分配。它与RAM或更大(paging)的数量一样巨大。

  • 堆栈要快得多,因为它通过简单的堆栈指针移动“已分配”。它通常有尺寸限制。例如,在C ++中,此限制在编译阶段设置(GCC上为ulimit -s,MSVC上为/STACK:reserve/STACK:reserve,commit

堆栈通常要小得多,容易溢出(这就是我们所说的堆栈溢出)。例如,在C ++中,您很可能无法执行此操作:

int main()
{
    int large_array[1000000];
    return 0;
}

由于:

enter image description here

虽然这很好:

int main()
{
    int* large_array = new int[1000000]; //allocated from heap
    return 0;
}

3。一些非常聪明的人。

4. 仔细阅读第1-3点,您就会知道答案。