我通过一些谷歌搜索关于Heap&堆栈,但大多数答案只是说它的概念描述,差异。
我很好奇其他事情。
正如标题所说,物理内存中的堆和堆栈在哪里?
他们的体型如何?例如,我在台式机上使用12千兆字节内存,那么Heap多少钱?堆栈大小是多少?
谁制作了这两种不同类型的概念?
我可以操纵Heap&堆栈的分配?如果他们每个占用50%的内存,(如果Heap占用6千兆字节内存,在我的情况下堆栈也需要6千兆字节),我可以调整它们吗?
答案 0 :(得分:3)
- 正如标题所说,物理内存中的堆和堆栈在哪里?
醇>
由于CPU已经MMUs在虚拟内存和物理内存之间添加了一层间接,因此堆和堆栈已经存在于物理内存中。自从现代操作系统实现ASLR以来,堆和堆栈也在虚拟内存中的任何位置。
- 他们的体型如何?例如,我在台式机上使用12千兆字节内存,那么Heap多少钱?堆栈大小是多少?
醇>
从小开始,随需求增长。在Unix上,最大堆栈大小由ulimit -s
设置,堆大小由ulimit -d
限制。您可以使用ulimit -a
在Unix操作系统上查看默认设置的限制。
- 谁制作了这两种不同类型的概念?
醇>
我敢打赌这可以追溯到至少20世纪60年代。 Wikipedia has a reference from 1960.
- 我可以操纵Heap&堆栈的分配?如果他们每个占用50%的内存,(如果Heap占用6千兆字节内存,Stack在我的情况下也需要6千兆字节),我可以调整它们吗?
醇>
正如已经说过的那样,他们自己调整大小,或者更确切地说,他们在操作系统和用户设定的限制内按需增长。如果您使用的是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;
}
由于:
虽然这很好:
int main()
{
int* large_array = new int[1000000]; //allocated from heap
return 0;
}
3。一些非常聪明的人。
4. 仔细阅读第1-3点,您就会知道答案。