在我使用过的任何平台上,堆栈大小始终是有限的。您必须在某个时刻(在程序启动之前)指定最大堆栈大小,并且它是预先分配的。为什么堆栈不能是驻留在堆内存中的链表?那么它几乎是无限的。它是当今所有计算机体系结构的固有属性吗?
我的问题与任何特定的编程语言或平台无关。这是纯粹的学术好奇心。
(如果有任何歧义的话,我所说的“堆栈”是指线程存储执行跟踪和参数的内存。)
连续存储的堆栈需要有一个已知的最大大小,以便可以直接在内存中创建多个堆栈,这样的堆栈比以链表实现的堆栈处理速度更快且更容易实现。但在 Windows 和 Linux 上,进程/线程堆栈使用虚拟内存地址空间,因此限制它们的唯一一般目的是在编程语言或编译器方面:
- 作为断点功能 - 避免:函数的过度或意外递归,以及大值的过度复制。
- 为了兼容性。
在通常使用的硬件架构中,没有 Stack 的表示。可以使用堆栈强制某些系统上的某些数据进入较低级别,或任何,CPU缓存,但是,嗯……,这是值得怀疑的。
- For more words:
- https://en.wikipedia.org/wiki/Stack_machine#Computers_using_call_stacks_and_stack_frames
- https://en.wikipedia.org/wiki/Call_stack
Linux 和 Windows
在Linux上,进程可以使用自己的虚拟地址空间,因此至少有1个堆栈可以没有大小限制
(因此仅受以下限制:可能的地址数量和存储的数据)
- 但是进程的附加线程需要有一个已知的最大堆栈大小,我假设它们的堆栈地址是从地址空间的另一侧开始保留的,而不是主线程堆栈的地址。
#include <sys/resource.h>
rlimit *limit = {
.rlim_cur = RLIM_INFINITY, // user-settable limit
.rlim_max = RLIM_INFINITY // system/admin limit
};
int getrlimit(RLIMIT_STACK, limit);
*limit.rlim_cur = RLIM_INFINITY;
int setrlimit(RLIMIT_STACK, limit); // set limit for current process
在 Windows 上,没有无限堆栈空间的选项。也许是因为它的进程使用相同的虚拟地址空间,以实现兼容性或性能。或者也许是为了强制安全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)