当 C++ 程序启动时,会分配一些内存段/区域:
对于程序本身和使用的库。程序及其库的大小是预先知道的。
用于全局变量和常量。类似地,这些内存段的大小在编译时是已知的。
不过堆栈和堆处于不同的情况。这些的大小似乎不是固定的。
我绝不是 C++ 内部工作的专家,所以请考虑纠正我在问题中所做的任何错误假设。
为了这个问题,让我们假设我们在 Windows10 上运行并使用 Visual C++(请告诉我答案在任何其他主要平台上是否会有所不同)。
我的问题是:
堆的大小是动态的吗? (即堆的大小可以在运行时改变吗?)我认为是因为如果需要,您总是可以malloc
更多空间。
堆栈的大小是动态的吗?这比较棘手,因为我们知道将调用哪些函数以及它们将具有哪些/多少局部变量,但让我认为它的大小可能是动态的的是诸如递归、lambdas 函数指针、从其他文件读取值之类的东西可以使它无法判断一个函数将被调用多少次。
如果以上两个问题的答案是“是”,那么这些内存区域在物理内存中的位置如何?它们是否彼此相邻并与程序存储器相邻? (即从地址0
到地址x
的实际程序,从地址x
到x+k
的堆栈以及从(x+k)
到{{1}的堆}?)
如果 3. 的答案是“是”,那么当需要调整堆栈等“中间”内存区域时会发生什么?
这纯粹是一个教育问题。在回答中,请纠正我所做的任何错误假设。