关于c ++:物理内存中的堆和堆栈在哪里?

Where is Heap and Stack on Physical Memory?

我通过谷歌阅读了一些关于堆和堆栈的内容,但大多数答案只说明了它的概念描述、差异。

我对其他事情很好奇。

  • 正如标题所说,物理内存上的堆和堆栈在哪里?

  • 它们的尺寸如何?例如,我在我的台式电脑上使用12千兆字节的内存,那么heap值是多少?堆栈大小是多少?

  • 这两种不同类型的概念是谁提出的?

  • 我可以操作堆和堆栈的分配吗?如果它们每个占用50%的内存(如果堆占用6G字节的内存,在我的例子中,堆栈也占用6G字节),我可以调整它们的大小吗?


  • as title says, Where is Heap and Stack on Physical Memory?
  • 自从CPU让MMU在虚拟内存和物理内存之间添加一层间接寻址以来,堆和堆栈就一直存在于物理内存中的任何地方。自从现代操作系统实现了ASLR以来,堆和堆栈也一直存在于虚拟内存中的任何地方。

  • How is their size? For example, I use 12 giga byte memory at my desktop PC, then how much is Heap? and how much is Stack size?
  • 两者都是从小处做起,按需增长。在Unix上,最大堆栈大小由ulimit -s设置,堆大小由ulimit -d限制。您可以看到在使用ulimit -a的UNIX操作系统上默认设置了哪些限制。

  • Who made these 2 different type concept?
  • 我敢打赌,这至少可以追溯到20世纪60年代,维基百科有1960年的参考资料。

  • Can I manipulate Heap & Stack's allocation? if they take 50% of memory each, (if Heap take 6 giga byte memory, Stack take 6 giga byte too in my case), can I resize them?
  • 如前所述,它们会根据需要调整自己的大小,或者更准确地说,在操作系统和用户设置的限制范围内增长。如果您使用的是unix和bash,请参阅ulimit的帮助。


    1。它可以无处不在。即使在物理内存之外,因为在应用程序方面也没有这样的东西。用户区中的所有内容都使用虚拟内存,可以映射到RAMHDD上的交换区域。这里没有某些假设,对不起。

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

    • 堆通常被认为较慢。它是根据应用程序要求分配的。它和RAM的数量一样大,甚至更大(分页)。

    • 堆栈更快,因为它通过简单移动堆栈指针"分配"。它通常有大小限制。例如,在C++中,这个限制被设置在编译阶段(ECDOX1对GCC,EDCOX1,0,8,EDCOX1,9,在MSVC上)。

    堆栈通常要小得多,很容易溢出(这就是我们所说的堆栈溢出)。例如,在C++中,你很可能无法做到这一点:

    1
    2
    3
    4
    5
    int main()
    {
        int large_array[1000000];
        return 0;
    }

    因为:

    enter image description here

    虽然这很好:

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

    三。一些非常聪明的人。

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