某个程序的堆栈内存有多大,是不是有任何编译器标志可以设置它?

Posted

技术标签:

【中文标题】某个程序的堆栈内存有多大,是不是有任何编译器标志可以设置它?【英文标题】:How big is the stack memory for a certain program, and are there any compiler flags that can set it?某个程序的堆栈内存有多大,是否有任何编译器标志可以设置它? 【发布时间】:2013-02-26 01:55:41 【问题描述】:

正如标题所述:关于堆栈大小是否有任何一般的“经验法则”。我猜大小会因操作系统、架构、缓存大小、可用 RAM 大小等而有所不同。

但是一般来说可以说什么,或者有什么方法可以找出,这个程序允许使用多少堆栈?。作为一个额外的问题,是否有任何方法(使用编译器标志等(这里主要考虑 C/C++,但也更通用))堆栈的大小可以由用户设置为固定大小?

顺便说一句,我完全出于好奇而问,我没有堆栈溢出。 :)

【问题讨论】:

给定程序将使用的堆栈数量通常是不可确定的(它相当于Halting problem)。您是在问如何明确强制限制堆栈大小? 您可能对这个问题感兴趣***.com/questions/156510/… 首先感谢!但为什么这是不可判定的,相当于停机问题呢? @Anders:您的程序可用的堆栈大小非常明确。任意程序正确操作所需的堆栈量类似于该程序的停机问题(并且通常只是不可确定的——大多数特定程序都允许分析)。 @AndersNannerupKristensen:因为为了确定最大堆栈使用量,您基本上需要分析所有可能的代码路径(我相信您可以看到与停机问题所带来的问题非常相似) .但是,在某些(也许很多)情况下,这可以通过静态分析来解决。但是递归或函数指针使这变得很棘手。 【参考方案1】:

是的,您可以设置堆栈大小,它通常是一个链接器标志,它取决于您的工具链(通常由编译器的名称引用)。

For Microsoft Visual C++, use the /F option 更改大小,DUMPBIN /HEADERS to see what the setting is。 对于 GCC 工具链和大多数其他 Unix 链接器,请使用 -Wl,--stack

您还可以在 *** 上找到几个现有问题。

【讨论】:

GCC/GNU-ld 中的 --stack 是特定于 Windows 的。它不用于其他目标。 @R..:选项拼写不同(-stack_size)还是您认为没有选项? 没有选项。在 unix 系统上,初始线程的最大堆栈大小由 ulimit 命令/setrlimit 函数确定,但在 Linux 上,保留/提交的堆栈大小固定在大约 128k 加上一些额外的大小,这似乎取决于环境(132k 或 136k 是典型的总数)。如果程序试图将堆栈增长到超出此范围,并且有可用内存,它可以增长到ulimit/setrlimit 设置的限制,但目前没有办法保留超过 ~128k exec地点。 @R..:嗯,我知道我使用的大多数(可能是所有)嵌入式目标都有这样的链接器选项。因此,Linux 似乎是个奇怪的人。而且我不认为“内存空闲”是相关的,除非你禁用了交换和过度使用,唯一重要的是是否有足够的连续虚拟地址空间。 我通常假设过度使用已禁用。启用过量使用会导致严重的错误、不合格、危险的不稳定系统。 :-) 无论如何,即使启用了过度使用,尝试扩大堆栈也可能会触发 OOM 杀手杀死您的进程。【参考方案2】:

在 Windows 中,线程的默认堆栈大小为一百万字节,与操作系统等无关。

在托管代码(C#、VB 等)中,您可以使用此 ctor 强制新线程具有不同的堆栈大小:

http://msdn.microsoft.com/en-us/library/5cykbwz4.aspx

要更改 Windows 程序的默认线程的堆栈大小,无论是否托管,都可以使用 editbin 实用程序:

http://msdn.microsoft.com/en-us/library/xd3shwhf.aspx

【讨论】:

其实默认大小(如果你传0给CreateThread的话)和启动线程的栈大小一样(在PE头中指定)。 @BenVoigt:我不知道,但这很有意义。谢谢! 只是附加信息:用于创建本机线程(允许指定堆栈大小)的 API 是 CreateThread

以上是关于某个程序的堆栈内存有多大,是不是有任何编译器标志可以设置它?的主要内容,如果未能解决你的问题,请参考以下文章

存储递归函数的堆栈有多大。我应该考虑哪些因素,如操作系统、编译器和硬件

怎样检测有没有使用tcmalloc

8086的寻址能力有多大?

C# string的容量多大

realloc 失败的可能性有多大?

计算机基础课程对编写代码有多大影响