C / C ++程序的最大堆栈大小?

时间:2014-12-15 10:13:17

标签: c++ c data-structures stack

我已尝试过以下程序。创建此程序的目的是发现有关堆栈大小的更多信息。

int main()
{
    int nStack[100000000];
    return 0;
}

执行上述代码后,由于堆栈大小分配,程序崩溃。 堆栈的最大可能大小是多少?它是否适用于每个程序/计算机?可以增加吗?

我想知道为了知识。如果任何人都可以在C / C ++中提供示例,那将非常有用。

4 个答案:

答案 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.