物理内存堆和堆栈在哪里?
我通过一些关于堆和堆栈的搜索阅读,但大多数答案只是说明了它的概念描述和差异。
我很好奇其他的事情。
正如标题所说,堆和物理内存堆栈在哪里?
它们的大小如何? 例如,我在台式电脑上使用12千兆字节的内存,那么堆是多少? 以及堆栈大小是多少?
谁制造了这两种不同类型的概念?
我可以操纵堆和堆栈的分配吗? 如果它们每个都占用50%的内存(如果Heap占用6千兆字节内存,Stack在我的情况下占用6千兆字节),我可以调整它们的大小吗?
自从CPU有MMU在虚拟内存和物理内存之间添加一个间接层之后,堆和堆栈就一直存在于物理内存中。 自从现代操作系统实施ASLR以来,堆栈和堆栈也一直存在于虚拟内存中。
  两者都从小规模开始并按需求增长。  在Unix上,最大堆栈大小由ulimit -s设置,堆大小由ulimit -d限制。  你可以看到你的Unix操作系统默认在ulimit -a上设置了什么限制。 
我敢打赌至少可以追溯到20世纪60年代。 维基百科有一个从1960年的参考。
  正如已经说过的那样,他们调整自己的尺寸,或者更准确地说,它们是根据需求增长的,并且在操作系统和用户设定的限度内。  如果您使用的是Unix和bash,请参阅ulimit帮助。 
  1.它可以是无处不在。  即使在物理记忆之外,因为在应用方面没有这样的事情。  用户所有内容都使用虚拟内存,可以将其映射到HDD上的RAM或交换区域。  这里没有特定的假设,对不起。 
2.它们都是动态增长的,区别在于速度和大小限制:
  堆通常被认为是较慢的。  它根据应用要求进行分配。  它和RAM的数量甚至更大(分页)一样巨大。 
  堆栈速度更快,因为它通过简单移动堆栈指针“分配” 。  它通常有大小限制。  例如,在C ++中,此限制设置为编译阶段(GCC上的ulimit -s , /STACK:reserve , /STACK:reserve,commit MSVC上的/STACK:reserve,commit )。 
堆栈通常要小得多,并且可以很容易溢出(这就是我们所说的堆栈溢出 )。 例如,在C ++中,您很可能无法执行此操作:
int main()
{
    int large_array[1000000];
    return 0;
}
因为:

虽然这非常好:
int main()
{
    int* large_array = new int[1000000]; //allocated from heap
    return 0;
}
3.一些非常聪明的人。
4.仔细阅读第1-3点,你就会知道答案。
链接地址: http://www.djcxy.com/p/2341.html