最大函数堆栈大小是有限的,如果我们使用大堆栈变量或粗略使用递归函数,可能会很快耗尽。
但是主要的堆栈并不是真正的堆栈。 main总是被称为一次,而不是递归。无论如何,main的堆栈是在最开始时分配的静态存储,它一直存在到最后。这是否意味着我可以在main的堆栈中分配大数组?
int main()
{
double a[5000000];
}
答案 0 :(得分:2)
这是100%编译器和系统依赖,就像大多数这种有趣的业务一样。哎呀,即使是堆栈的存在也不是标准规定的。
实际上,是的,它在堆栈上,不,你不能在堆栈上分配这样的东西而不会遇到麻烦。
答案 1 :(得分:2)
main
只是一个正常的功能。堆栈大小取决于系统。
Alos记住,对于所有函数调用,您的进程只共享一个堆栈。项目从堆栈中推送和弹出,因为函数由main
调用。
答案 2 :(得分:1)
它是实现定义的(语言标准不讨论堆栈,AFAIK)。但通常情况下,main
就像任何其他函数一样存在于堆栈中。
答案 3 :(得分:0)
以这种方式分配数组时,它会在堆栈上分配。堆栈可以增长到平台相关的最大大小。是的,你已经超越了它。
答案 4 :(得分:0)
第二个想法,我记得 - 它可以递归调用。看看这个混淆的代码:
http://en.wikipedia.org/wiki/Obfuscated_code
它多次调用main并创造奇迹:)无论如何,这是一个有趣的链接。所以,它肯定是堆栈分配的,对不起!
答案 5 :(得分:0)
堆栈是所有函数都使用的东西 - 你提出问题的方式表明每个函数都给出了一个堆栈而不是这种情况。
每次函数调用都会增加堆栈使用量 - main()
是第一个。您在示例中使用的分配与在另一个函数中进行堆栈分配一样糟糕。
答案 6 :(得分:0)
对于大多数现代系统,没有必要限制堆栈大小的真正原因。您可以调整操作系统参数,该程序将正常工作。 (与任何在堆栈上分配相同数量的数据一样,main
或不是。)
但是,如果您确实想要一个生命周期等于程序持续时间的对象,请在main
内创建一个全局变量而不是本地变量。大多数平台不会人为地限制全局对象的大小 - 它们通常可以与内存映射允许的一样大。
顺便说一句,main
在C ++程序期间不活动。可能之前是构造全局对象,然后销毁相同的atexit
处理程序。