【发布时间】:2015-12-06 16:46:41
【问题描述】:
在堆栈中创建激活记录。这些是在程序运行期间创建和销毁的 - 即堆栈区域在程序运行期间更改其大小。
即使堆栈区域中的内存是在运行时创建的,但内存量(激活记录大小)是在编译时确定的。
我没有得到这样的概念,即在运行时创建堆栈区域中的内存时,如何在编译时确定激活记录的大小?
【问题讨论】:
-
对于给定的操作系统/操作环境,堆栈的数量通常是固定的。如果你的记录溢出堆栈,你的程序就会崩溃。
-
每次调用函数时,都需要一些堆栈空间,因此分配了空间——激活记录。在编译时就知道给定过程的激活记录有多大(或多或少;可变长度数组使事情复杂化),但不知道总共需要多少空间,因为函数调用的顺序是' t 已知——尤其是递归等。
-
一般来说,堆栈区域在程序运行期间不会改变大小。这就是为什么您可以在不耗尽机器内存的情况下发生堆栈溢出。运行时的变化是堆栈中有多少正在使用,有多少可用,未使用。
-
不确定我是否明白这个问题。如果如果是关于编译器如何确定所需的堆栈大小 - 那么它不能,只有一些预定义的大小编译器(或者更像它,链接器)使用并希望它就足够了。如果是关于为什么没有实现堆栈增长,那么我想没有人真正认为需要这样做,特别是如果这个操作不是免费的。
-
每个线程的堆栈大小是固定的,通常使用链接器参数设置或具有默认值。
标签: c