Jay*_*Jay 4 c memory stack memory-management
编码时我们应该考虑对堆栈上创建的变量总大小的限制吗?如果是,我们应该根据什么来决定它?它依赖于操作系统,内存可用性等吗?有没有可以检查这个的编译器选项?
方向上的任何指针也会有所帮助.
这是C标准中用户不太友好的领域之一.
这完全取决于实现,而且"几乎不可能"正确地执行.C标准并不保证您可以定义哪些自动变量而不会破坏堆栈,或者当您这样做时会发生什么,或者测量堆栈使用或指定堆栈大小的任何方式,或者任何检测您即将用完的方法堆栈,可能具有不可预测的结果.该标准甚至没有提到"堆栈"这个词.
因此,您应该注意您使用的堆栈数量,但是嵌入式系统上的堆栈数量可能会多少甚至更少,而桌面系统上的堆栈数量则为1MB或更多.在Windows上,你几乎不关心堆栈 - 只要你没有在其上放置大量数组,或者递归到一个等于某个数组或列表大小的深度,那么你会没事的.在有限的系统上,将文件名放在堆栈上并不一定是个好主意.但是如果你只把内置类型和微小的数组和结构放在堆栈上,如果你只是递归到深度日志N,那么你几乎可以在任何地方做得很好.如果你不好的话,希望你会得到一个明显的崩溃,但你不能确定.
您最关键的时间是将代码移植到新系统 - 如果您无法估计堆栈使用"不是很多",那么您需要仔细测试.因此,如果您担心有限系统的可移植性,那么您必须保守堆栈使用.至于"保守"意味着什么,它取决于"有限"意味着什么,但如果你对"有限"的手机级别感兴趣,那么文件名的大小就是你可能想到的地方,"应该相反,它会在堆上?",但当然上下文很重要:如果你的文件处理代码有10层,修改每层的文件名,那么你不想在堆栈上这样做.如果它只有几层,你知道它赢了'
虽然我说"手机",但现代智能手机更接近桌面型号"哦,只需使用你需要的东西,就可以了".如果你正在编写类似PIC的东西(并且坚持编写C),那么基本上忘记了可移植的假设,并准确地跟踪你使用的堆栈与可用的堆栈.
我不记得我记得曾经遇到过像0x6adb015描述的那样有效的受保护操作系统,所以你甚至不能说"无论我使用堆栈还是堆,它们都来自同一个池" .它们不是必然的.我遇到的两个主要模型是:
堆栈地址空间是预先分配的(也许是承诺的,也许不是),所以你可以使用多少堆栈,甚至是你的程序崩溃,即使剩下内存也是如此.
堆栈是动态扩展的,因此您可以继续使用堆栈,直到内存不足为止.
因此,堆栈可能比堆更有限的资源.正如Mitch Wheat所说,编译器(或链接器)选项可以改变该区域的大小,请查看手册以获取详细信息.OS还可以提供运行时选项,例如ulimit.我想补充说,线程API可以让你指定新线程的堆栈大小.但是,它仍然完全取决于实现.