我在C中声明了一个大小超过1024字节的结构变量。在运行Coverity(静态代码分析器应用程序)时,它报告此堆栈变量大于1024字节,因此是错误原因。 我想知道我是否需要担心这个警告?单个堆栈变量的大小是否真的有最大限制?
感谢, 澈
答案 0 :(得分:3)
变量的最大大小受到堆栈最大大小的限制(具体而言,从当前任何使用中剩余多少堆栈,包括堆栈中较高功能的变量和参数以及进程帧开销)。
在Windows上,第一个线程的stacksize是可执行文件set during linking的属性,而线程的堆栈大小可以在thread creation期间指定。
在Unix上,第一个线程的堆栈大小通常仅受限于它增长的空间。根据特定的Linux如何布局内存以及您对共享对象的使用,这可能会有所不同。也可以在thread creation期间指定线程的堆栈大小。
答案 1 :(得分:2)
它试图保护你的问题是堆栈溢出,因为执行路径不同,在测试中很难找到。主要是因为这个原因 - 在堆栈上分配大量数据被认为是不好的形式。你很可能在嵌入式系统上遇到一个问题。
换句话说,它设置了一个任意限制,它认为堆栈上的数据太多了。
答案 2 :(得分:2)
是。当然它受到系统地址空间的限制。它还受到操作系统分配给堆栈的空间量的限制,通常在程序启动后无法更改,但可以事先更改(通过启动过程或可执行文件的属性)。快速浏览一下,我的OS X系统上的最大堆栈大小为8 MiB,而在Linux上则为10 MiB。在某些系统上,您甚至可以为您启动的每个不同的线程分配不同数量的堆栈,尽管这种用途有限。大多数编译器对单个堆栈帧中允许的数量也有另一个限制。
在现代桌面上,除非函数是递归的,否则我不会担心1k堆栈分配。如果您正在编写嵌入式代码或代码以供在OS内核中使用,那么这将是一个问题。 Linux内核中的代码仅允许64 KiB或更少,具体取决于配置选项。
答案 3 :(得分:1)
关于堆栈大小http://www.embedded.com/columns/technicalinsights/47101892?_requestid=27362
,本文非常有趣是的,它依赖于操作系统,还有其他的东西依赖。抱歉这么模糊。您也可以在gcc集合中挖掘一些代码来测试堆栈大小。
答案 4 :(得分:0)
如果你的函数(直接或间接)涉及递归,那么在堆栈上分配大量将限制递归的深度,并可能很好地破坏堆栈。在Windows下,此堆栈保留默认为1MB,但您可以使用链接器命令静态增加它。堆栈将随着使用而增长,但操作系统有时不能扩展它。我在我的网站here上更详细地讨论了这个问题。
答案 5 :(得分:0)
正如我所见,C编译器(turbo)为变量提供了64000k的最大大小。如果我们需要更大的尺寸,那么它被声明为"巨大的"。
答案 6 :(得分:0)
尝试使用大量的堆栈空间并不是一个好主意。
以下是默认gcc堆栈大小的链接:http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt
此外,您可以指定--stack,xxxxx
来自定义堆栈大小,因此最好假设xxxxx
是一个小数字,并坚持使用堆分配。