gpt4 book ai didi

c - 堆栈上的总变量大小是否有限制?

转载 作者:太空狗 更新时间:2023-10-29 15:17:11 24 4
gpt4 key购买 nike

在编码时,我们是否应该考虑对在堆栈上创建的变量的总大小进行一些限制?如果是,我们应该根据什么来决定?它取决于操作系统、内存可用性等吗?有没有编译器选项可以检查这个?

方向上的任何指示也会有所帮助。

最佳答案

这是 C 标准中用户不太友好的区域之一。

这完全取决于实现,而且几乎不可能做到“正确”。 C 标准不保证您可以在不破坏堆栈的情况下定义哪些自动变量,或者当您这样做时会发生什么,或者任何测量堆栈使用或指定堆栈大小的方式,或者任何检测您即将用完的方式堆栈,可能会产生不可预知的结果。该标准甚至没有提到“堆栈”这个词。

因此,您应该注意您正在使用多少堆栈,但在嵌入式系统上可能是几 k 甚至更少,而在桌面系统上可能是 1MB 或更多。在 Windows 上,您几乎不关心堆栈——只要您不在其上放置大量数组,或者递归到等于某个数组或列表大小的深度,那么您就可以了。在有限的系统上,将文件名放在堆栈上不一定是个好主意。但是,如果您只将内置类型、微型数组和结构放在堆栈上,并且如果您只递归到深度 log N,那么您几乎可以在任何地方使用。如果你不正常,希望你会遇到明显的崩溃,但你不能确定。

最关键的时候是你在移植代码到一个新系统的时候——如果你不能估计堆栈使用“不是很多”,那么你需要仔细测试。出于这个原因,如果您担心对有限系统的可移植性,那么您必须保守地使用堆栈。至于“conservative”是什么意思,有点看“limited”是什么意思,但如果你对手机级别的“limited”感兴趣,那么文件名的大小大概就是你可能会想的,“should这是在堆上吗?”,但当然上下文很重要:如果你的文件处理代码有 10 层,在每一层修改文件名,那么你不想在堆栈上这样做。如果它只有几层,并且您知道它不会被堆栈上已经有任何大东西的代码调用,您可能可以摆脱它。

虽然我说的是“手机”,但现代智能手机更接近于“哦,用你需要的,就好了”的桌面模型。如果您正在为类似 PIC 的东西编程(并坚持编写 C),那么基本上忘记可移植的假设,并准确跟踪您正在使用的堆栈与可用堆栈的比较。

我想我不记得曾经遇到过以 0x6adb015 描述的方式工作的 protected 操作系统,所以你甚至不能说“我使用堆栈还是堆并不重要,它们都来自同一个池结束”。他们不一定。我遇到的两个主要模型是:

  • 堆栈地址空间是预先分配的(可能已提交,也可能未分配),因此您可以使用多少堆栈是有硬性限制的,而且即使有剩余内存,您的程序也会崩溃。

  • Stack 是动态扩展的,因此您可以一直使用 stack 直到内存不足。

因此,堆栈可能是一种比堆更有限的资源。正如 Mitch Wheat 所说,编译器(或链接器)选项可以改变该区域的大小,请查看您的手册以了解详细信息。操作系统还可以提供运行时选项,例如 ulimit。我要补充一点,线程 API 可以让您指定新线程的堆栈大小。不过,它还是完全依赖于实现。

关于c - 堆栈上的总变量大小是否有限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2050207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com