应该在堆栈上分配的变量大小是否有最大限制?

我在C中声明了一个大小超过1024字节的结构变量。 在运行Coverity(静态代码分析器应用程序)时,它报告此堆栈变量大于1024字节,因此是错误原因。 我想知道我是否需要担心这个警告? 单个堆栈变量的大小是否真的有最大限制?

谢谢,谢

变量的最大大小受到堆栈最大大小的限制(具体而言,当前使用中剩余多少堆栈,包括堆栈中较高function的变量和参数以及进程帧开销)。

在Windows上,第一个线程的stacksize是链接期间可执行集的属性,而线程的stacksize可以在线程创建期间指定。

在Unix上,第一个线程的堆栈大小通常仅受限于它增长的空间。 根据特定Linux如何布局内存以及共享对象的使用,这可能会有所不同。 在线程创建期间也可以指定线程的堆栈大小。

它试图保护你的问题是堆栈溢出,因为执行路径不同,在测试中很难找到。 主要是出于这个原因 – 在堆栈上分配大量数据被认为是不好的forms。 但是,您很可能在嵌入式系统上遇到问题。

换句话说,它为它在堆栈上考虑太多数据设置了一个任意限制。

是。 当然它受到系统地址空间的限制。 它还受到操作系统分配给堆栈的空间量的限制,通常在程序启动后无法更改,但可以事先更改(通过启动过程或可执行文件的属性)。 快速浏览一下,我的OS X系统上的最大堆栈大小为8 MiB,而在Linux上则为10 MiB。 在某些系统上,您甚至可以为您启动的每个不同的线程分配不同数量的堆栈,尽管这种用途有限。 大多数编译器还对其在单个堆栈帧中允许的数量有另一个限制。

在现代桌面上,除非函数是递归的,否则我不会担心1k堆栈分配。 如果您正在编写嵌入式代码或代码以在OS内核中使用,那么这将是一个问题。 Linux内核中的代码仅允许64 KiB或更少,具体取决于配置选项。

关于堆栈大小,本文非常有趣http://www.embedded.com/columns/technicalinsights/47101892?_requestid=27362

是的,它依赖于操作系统以及其他依赖的东西 。 抱歉这么模糊。 您也可以在gcc集合中挖掘一些代码来测试堆栈大小。

如果您的函数(直接或间接)涉及递归,那么在堆栈上分配大量将限制递归的深度,并可能很好地破坏堆栈。 在Windows下,此堆栈保留默认为1MB,但您可以使用链接器命令静态增加它。 堆栈将随着使用而增长,但操作系统有时无法扩展它。 我在这里的网站上更详细地讨论了这个问题 。

正如我所见,C编译器(turbo)为变量提供了64000k的最大大小。 如果我们需要更大的尺寸,那么它被宣称为“巨大的”。

尝试使用大量的堆栈空间并不是一个好主意。

以下是默认gcc堆栈大小的链接: http : //www.cs.nyu.edu/exact/core/doc/stackOverflow.txt

此外,您可以指定--stack,xxxxx来自定义堆栈大小,因此最好假设xxxxx是一个小数字并坚持堆分配。