我通过谷歌搜索了解了堆栈(Heap & Stack)的概念和区别, 但我还想了解其他方面的问题。
堆和栈在物理内存中的位置是什么?
它们的大小是多少?例如,如果我使用12GB记忆体,那么堆的大小是多少?栈的大小又是多少?
是谁创造了这两种不同的概念?
我可以操纵堆和栈的分配吗?如果它们各占内存的50%(如果在我的情况下堆占用了6GB内存,则栈也占用了6GB内存),我可以调整它们的大小吗?
我通过谷歌搜索了解了堆栈(Heap & Stack)的概念和区别, 但我还想了解其他方面的问题。
堆和栈在物理内存中的位置是什么?
它们的大小是多少?例如,如果我使用12GB记忆体,那么堆的大小是多少?栈的大小又是多少?
是谁创造了这两种不同的概念?
我可以操纵堆和栈的分配吗?如果它们各占内存的50%(如果在我的情况下堆占用了6GB内存,则栈也占用了6GB内存),我可以调整它们的大小吗?
ulimit -s
设置,而堆大小受ulimit -d
限制。您可以使用ulimit -a
查看Unix OS默认设置的限制。正如已经提到的,它们会自行调整大小,更准确地说,它们会根据操作系统和用户设置的限制按需增长。如果您正在使用Unix和bash,请参阅
- 如果堆和栈每个占用50%的内存(如果在我的情况下堆占用6GB内存,栈也占用6GB内存),我能否操纵堆栈的分配?我能调整它们的大小吗?
ulimit
的帮助文档。1. 它可以到处存在。即使在物理内存之外,因为在应用程序方面没有这样的东西。用户空间中的所有内容都使用虚拟内存,可以映射到RAM
或HDD
上的交换区域。这里没有任何确定的假设,抱歉。
2. 它们都是动态增长的,区别在于速度和大小限制:
堆栈通常被认为较慢。它根据应用程序要求进行分配。它的大小与RAM
的数量相同,甚至更大(分页)。
堆栈要快得多,因为它通过简单移动堆栈指针来“分配”。它通常有大小限制。例如,在C++中,此限制在编译阶段设置(GCC上的ulimit -s
,MSVC上的/STACK:reserve
,/STACK:reserve,commit
)。
栈通常比较小,很容易溢出(这就是我们所说的堆栈溢出)。例如,在C++中,您很可能无法执行以下操作:
int main()
{
int large_array[1000000];
return 0;
}
While this is perfectly fine:
int main()
{
int* large_array = new int[1000000]; //allocated from heap
return 0;
}
3. 一些非常聪明的人。
4. 仔细阅读1-3点,你就会知道答案。