我已尝试过以下程序。创建此程序的目的是发现有关堆栈大小的更多信息。
int main()
{
int nStack[100000000];
return 0;
}
执行上述代码后,由于堆栈大小分配,程序崩溃。 堆栈的最大可能大小是多少?它是否适用于每个程序/计算机?可以增加吗?
我想知道为了知识。如果任何人都可以在C / C ++中提供示例,那将非常有用。
答案 0 :(得分:18)
堆栈的最大大小是多少?
取决于实施。如今PC上通常只有一到几兆字节。
每个程序/计算机都修复了吗?
它通常固定在链接上,但标准没有定义它。某些操作系统也可以在运行时限制堆栈(例如,在Linux上RLIMIT_STACK
)。
可以增加吗?
取决于实施情况,这可能是可能的。有关详细信息,请参阅链接器的文档。可能还有操作系统和可执行格式的文档。
你应该动态分配大量的数组。
答案 1 :(得分:8)
对于基于Linux的应用程序,我们可以使用getrlimit和setrlimit API来了解各种内核资源限制,例如核心文件的大小,cpu时间,堆栈大小,漂亮的值,最大值。没有。 “RLIMIT_STACK”是linux内核中定义的堆栈的资源名称。下面是检索堆栈大小的简单程序:
#include <iostream>
#include <sys/time.h>
#include <sys/resource.h>
#include <errno.h>
using namespace std;
int main()
{
struct rlimit sl;
int returnVal = getrlimit(RLIMIT_STACK, &sl);
if (returnVal == -1)
{
cout << "Error. errno: " << errno << endl;
}
else if (returnVal == 0)
{
cout << "stackLimit soft - max : " << sl.rlim_cur << " - " << sl.rlim_max << endl;
}
}
答案 2 :(得分:-1)
要更改为进程加载程序引发的主线程分配的堆栈大小,以便在其入口点运行代码,请查看链接器文档。也可以在可执行标头元数据中编辑该堆栈大小。
答案 3 :(得分:-1)
我试过以下程序。
int main()
{
int nStack[519492];
cout<<"Okay!";
return 0;
}
输出:
Okay!
但如果我将数组大小增加1个字节,程序就会崩溃。
int main()
{
int nStack[519493];
cout<<"Okay!";
return 0;
}
输出:
No output. Program crashes.