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

Posted

技术标签:

【中文标题】C/C++ 程序的最大堆栈大小?【英文标题】:Maximum Stack Size for C/C+ Program? 【发布时间】:2015-02-13 09:51:54 【问题描述】:

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

int main()

    int nStack[100000000];
    return 0;

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

我想知道是为了知识。如果有人可以提供 C/C++ 的示例,那将非常有帮助。

【问题讨论】:

你试过用这个吗? getrlimit/setrlimit 删除[java],因为问题似乎不相关。 Pthreads 允许您为新线程提供自己的堆栈。您可以动态分配大量内存,然后以该内存作为其堆栈启动一个线程。 在许多嵌入式处理器上,堆栈是 16 个字。 @PeteBecker 仅用于空闲优先级“LED 闪烁”线程。 【参考方案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.

【讨论】:

【参考方案2】:

要更改分配给由进程加载程序引发以在其入口点运行代码的主线程的堆栈大小,请查看您的链接器文档。也可以在可执行标头元数据中编辑该堆栈大小。

【讨论】:

如果您与我们分享如何像上面所说的那样编辑堆栈大小,这将非常有帮助和信息量。我对此一无所知。【参考方案3】:

堆栈的最大大小是多少?

取决于实施。 1 到几兆字节在现在的 PC 上很常见。

每个程序/计算机都固定吗?

它通常固定在链接上,但标准并未定义它。一些操作系统也可以在运行时限制堆栈(例如 linux 上的RLIMIT_STACK)。

可以增加吗?

这可能取决于实施。有关详细信息,请参阅链接器的文档。可能还有操作系统的文档和可执行格式。

你应该像这样动态分配巨大的数组。

【讨论】:

在这种情况下,我们怎么知道我们的程序要消耗多少堆栈??? @PKThapa 一般来说,这是不可能的。对于不使用递归或变长数组的程序,您通常可以假设堆栈不会变得太大。 实际上,它通常由链接器修复,而不是编译器。 @MartinJames 感谢您指出这一点,我已经更正了这个细节。 @RBT 是的,堆栈限制也适用于 CLR。我对 C# 了解不多,但是通过谷歌搜索表明,在 C# 中,所有数组变量都在堆上分配(即动态分配),除非您使用 stackalloc 关键字。【参考方案4】:

对于基于 Linux 的应用程序,我们可以使用 getrlimit 和 setrlimit API 来了解各种内核资源限制,例如核心文件的大小、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;
   

【讨论】:

以上是关于C/C++ 程序的最大堆栈大小?的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之堆栈

为什么我的垃圾收集日志显示3.8GB作为最大可用堆大小,而我已经分配了4GB作为最大堆大小?

数据结构&算法_堆栈(堆栈)队列链表

基于自动变量的绝对最坏情况堆栈大小

Java 8 中默认的最大堆大小 (-Xmx) 是多少?

LeetCode 239 滑动窗口最大值- Python手撕最大堆