堆栈和堆的大小是否可变?
Are stack and heap variably sized?
根据许多资料,stack
和 heap
是由空 space 划分的内存区域。据我所知,随着程序 运行ning.
堆栈和堆相互增长
这是否意味着 stack
和 heap
都是可变大小的?如果是,它们中的一个是否可以占用另一个在前一个 运行 期间占用的相同地址(假设两个 运行 发生在相同的内存地址)?
如果它们的大小可变,我猜 stack overflow
发生在 stack
试图拿走属于 heap
的东西时。如果不是,则 stack bound
就是它的原样,并放置在两个内存区域之间最初为空的 space 中间的某个位置。
一点澄清: 大小的可变性 这里我的意思是改变保留的 space。也就是说,在这里我暗示如果 stack
大小是可变的,则为其保留的 space 会发生变化(就像当您使用 realloc
更改数组的大小时,但这只是为了比较) ; stack overflow
然后通过堆栈达到某个边界而发生,无论是另一个区域,如 heap
还是其他。如果它不是可变的,保留的space保持不变,而stack overflow
只是由运行宁出保留的space造成的。我也想知道 heap
是否也有不同的大小。
堆栈在地址 space 中必须是连续的。堆没有这样的约束。除此之外的任何事情都取决于给定平台如何布置内存。
如果你的地址space不能有空洞,嵌入式设备的简单布局可以是:从地址n及以下是堆栈(堆栈往往向下增长),从n及以上可用于堆。静态是一些高地址,代码在 ROM 中。
Linux 和 Windows 运行 在带有 MMU 的平台上,因此在内存安排方面有更多选择。
根据许多资料,stack
和 heap
是由空 space 划分的内存区域。据我所知,随着程序 运行ning.
这是否意味着 stack
和 heap
都是可变大小的?如果是,它们中的一个是否可以占用另一个在前一个 运行 期间占用的相同地址(假设两个 运行 发生在相同的内存地址)?
如果它们的大小可变,我猜 stack overflow
发生在 stack
试图拿走属于 heap
的东西时。如果不是,则 stack bound
就是它的原样,并放置在两个内存区域之间最初为空的 space 中间的某个位置。
一点澄清: 大小的可变性 这里我的意思是改变保留的 space。也就是说,在这里我暗示如果 stack
大小是可变的,则为其保留的 space 会发生变化(就像当您使用 realloc
更改数组的大小时,但这只是为了比较) ; stack overflow
然后通过堆栈达到某个边界而发生,无论是另一个区域,如 heap
还是其他。如果它不是可变的,保留的space保持不变,而stack overflow
只是由运行宁出保留的space造成的。我也想知道 heap
是否也有不同的大小。
堆栈在地址 space 中必须是连续的。堆没有这样的约束。除此之外的任何事情都取决于给定平台如何布置内存。
如果你的地址space不能有空洞,嵌入式设备的简单布局可以是:从地址n及以下是堆栈(堆栈往往向下增长),从n及以上可用于堆。静态是一些高地址,代码在 ROM 中。
Linux 和 Windows 运行 在带有 MMU 的平台上,因此在内存安排方面有更多选择。