生产质量的 VC++ 代码中的递归

Posted

技术标签:

【中文标题】生产质量的 VC++ 代码中的递归【英文标题】:Recursion in production-quality VC++ Code 【发布时间】:2010-09-07 10:35:39 【问题描述】:

在编写生产质量的 VC++ 代码时,是否可以使用递归?为什么或为什么不?

【问题讨论】:

【参考方案1】:

是的。但从不在死代码中。那太傻了。

【讨论】:

它还没死!它渴望峡湾。 @Aardvark - 你不能投票给 cmets 真是太糟糕了;-)【参考方案2】:

当然 - 例如如果您想遍历树结构,您还会使用什么?

也许您希望有一个最大深度之类的东西,以确保您没有编写无限循环。 (如果这在您的示例中有意义)

【讨论】:

【参考方案3】:

有没有办法确定什么 点我会遇到一个堆栈 溢出?

取决于你走多远,以及实际递归有多大。我想你明白递归是做什么的吗?

【讨论】:

【参考方案4】:

有没有办法确定我会在什么时候遇到堆栈溢出?

不是真的。当您耗尽堆栈空间时会发生堆栈溢出 - 但是...

初始堆栈大小可以通过编程方式更改,并且可能会根据您的操作系统/编译器/等默认为不同的大小 已经用完多少取决于您的应用(以及您的应用使用的库)之前所做的 - 这通常是无法预测的 每次调用需要多少堆栈取决于您在函数中执行的操作。如果您只在堆栈上分配 1 个整数,您可能能够递归大量的时间,但如果您在堆栈上分配 200k 的缓冲区,则不会这么多。

我遇到的唯一一次是无限循环,或者使用前面提到的 200k 缓冲区。

我发现我的应用程序崩溃更可取,而不是它使用 100% CPU 永远循环并且必须被强制终止(这是远程服务器上的正确 PITA,因为 Windows 缺少 SSH,连接不良)

粗略的指导:您认为您的递归函数可能会连续调用自己超过 10,000 次吗?或者你在做一些愚蠢的事情,比如在堆栈上分配 200k 缓冲区?

如果是,请放心。 如果没有,请继续做更重要的事情。

【讨论】:

【参考方案5】:

递归对于遍历文件夹/目录等文件结构几乎是必不可少的。

如果使用递归,遍历树状结构非常容易。

【讨论】:

以上是关于生产质量的 VC++ 代码中的递归的主要内容,如果未能解决你的问题,请参考以下文章

高质量代码才能最快投入生产

VC++中栈的大小是多少?

编写高质量代码改善C#程序的157个建议——建议155:随生产代码一起提交单元测试代码

VC++常用功能开发汇总

有调用NtCreateFile函数的vc代码例子吗

如何设立正确的质量度量