在编码时,我们是否应该考虑对堆栈上创建的变量的总大小进行一些限制?如果是,我们应该根据什么来决定?它取决于操作系统、内存可用性等吗?是否有任何编译器选项可以检查这一点?
任何指向该方向的指示也会有所帮助。
这是 C 标准中不太用户友好的领域之一。
这完全取决于实现,并且几乎不可能“正确”地做到这一点。 C 标准不保证您可以在不破坏堆栈的情况下定义哪些自动变量,或者当您这样做时会发生什么,或者任何测量堆栈使用或指定堆栈大小的方法,或者任何检测您即将用完的方法堆栈,也许会产生不可预测的结果。该标准甚至没有提到“堆栈”这个词。
因此,您应该注意您使用的堆栈量,但在嵌入式系统上可能是几千甚至更少,而在桌面系统上可能是 1MB 或更多,多少才算太多。在 Windows 上,您几乎不关心堆栈 - 只要您没有在上面放置大量数组,或者递归到等于某些数组或列表大小的深度,那么您就可以了。在有限的系统上,即使将文件名放在堆栈上也不一定是个好主意。但是,如果您只将内置类型、微小数组和结构放在堆栈上,并且只递归到深度 log N,那么您在任何地方都会很好。希望如果你不舒服的话你会发生明显的崩溃,但你不能确定。
最关键的时候是当你将代码移植到新系统时——如果你无法估计堆栈使用“不是很多”,那么你需要仔细测试。因此,如果您担心有限系统的可移植性,那么您必须谨慎对待堆栈的使用。至于“保守”的含义,这在某种程度上取决于“有限”的含义,但如果您对手机级别的“有限”感兴趣,那么文件名的大小可能就是您可能会想到的“应该”这是在堆上吗?”,但是上下文当然很重要:如果您的文件处理代码有 10 层,在每一层修改文件名,那么您不希望在堆栈上执行此操作。如果它只有几层,并且您知道它不会被堆栈上已经有任何大内容的代码调用,那么您可能可以摆脱它。
虽然我说的是“手机”,但现代智能手机更接近于“哦,用你需要的就可以了”的桌面模式。如果您正在为类似 PIC 的东西进行编程(并坚持编写 C),那么基本上忘记可移植的假设,并准确跟踪您正在使用的堆栈与可用的堆栈进行比较。
我想我不记得曾经遇到过按照 0x6adb015 描述的方式工作的受保护操作系统,所以你甚至不能说“我使用堆栈还是堆并不重要,它们最终都来自同一个池” 。他们不一定。我遇到的两个主要模型是:
因此,堆栈可能是比堆更有限的资源。正如 Mitch Wheat 所说,编译器(或链接器)选项可以改变该区域的大小,请查看手册以了解详细信息。操作系统还可能提供运行时选项,例如ulimit
。我想补充一点,线程 API 可以让您指定新线程的堆栈大小。但同样,它完全取决于实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)