我已经尝试过下面的程序。创建该程序的意图是为了更多地了解堆栈大小。
int main()
{
int nStack[100000000];
return 0;
}
执行上述代码后,程序由于分配了巨大的堆栈空间而崩溃。 堆栈的最大可能大小是多少?它对每个程序/计算机来说是固定的吗?它可以增加吗?
出于知识的缘由,我想知道。如果有人能提供C/C++代码示例,那将非常有帮助。
我已经尝试过下面的程序。创建该程序的意图是为了更多地了解堆栈大小。
int main()
{
int nStack[100000000];
return 0;
}
执行上述代码后,程序由于分配了巨大的堆栈空间而崩溃。 堆栈的最大可能大小是多少?它对每个程序/计算机来说是固定的吗?它可以增加吗?
出于知识的缘由,我想知道。如果有人能提供C/C++代码示例,那将非常有帮助。
栈的最大大小是多少?
取决于实现方式。现在在PC上,一到几兆字节是典型的大小。
对于每个程序/计算机,它是固定的吗?
通常固定在链接时,但标准并未定义如此。某些操作系统也可以在运行时限制堆栈(例如linux上的RLIMIT_STACK
)。
它可以增加吗?
这可能取决于实现方式。请查看您的链接器文档以获取详细信息。还需要查看操作系统和可执行格式的文档。
您应该将大型数组动态分配。
stackalloc
关键字,否则所有数组变量都分配在堆上(即动态分配)。 - eerorika对于基于Linux的应用程序,我们可以使用getrlimit和setrlimit API来了解各种内核资源限制,例如core文件大小、CPU时间、堆栈大小、nice值、最大进程数等等。'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;
}
}
我尝试了下面的程序。
int main()
{
int nStack[519492];
cout<<"Okay!";
return 0;
}
Okay!
但是如果我将数组大小增加1个字节,程序就会崩溃。
int main()
{
int nStack[519493];
cout<<"Okay!";
return 0;
}
输出:
No output. Program crashes.
对于这种类型,您可以为此分配动态内存分配,并使用通用堆栈表示进行内存分配。如果需要大量的内存,可以使用链表作为堆栈的形式。对于C/C++,可以使用Malloc/New进行动态内存分配。希望您能理解。
(这是我从记忆中得知的,所以细节可能有误。如果我再次启动旧的PDP-11,我将要记得测试一下。)
要更改由进程加载器引发的主线程分配的堆栈大小以运行其入口点处的代码,请查看链接器文档。还可以在可执行文件头元数据中编辑该堆栈大小。
[java]
标签,因为这个问题似乎与Java无关。 - Peter Lawrey