繁体   English   中英

嵌入式 C++:是否使用异常?

[英]Embedded C++ : to use exceptions or not?

我意识到这可能是主观的,所以会问一个具体的问题,但首先是背景:

我一直是嵌入式软件工程师,但通常在 OSI 堆栈的第 3 层或第 2 层。 我不是一个真正的硬件人。 我通常总是做电信产品,通常是手机/手机,这通常意味着像 ARM 7 处理器。

现在我发现自己处于一个更通用的嵌入式世界,在一家小型初创公司中,我可能会转向“不那么强大”的处理器(这是主观的一点)——我无法预测是哪个。

我已经阅读了很多关于嵌入式系统中 C++ 中异常处理的辩论,但没有明确的答案。 有一些关于可移植性和一些关于运行时的小担忧,但它似乎主要归结为代码大小(或者我读错了辩论?)。

现在我必须决定是使用还是放弃异常处理——对于整个公司来说,永远(它会进入一些非常核心的软件)。

这可能听起来像“一段字符串有多长”,但有人可能会回答“如果你的一段字符串是 8051,那么不要。如果,OTOH,它是......”。

我往哪个方向跳? 超级安全并失去了一个好的功能,或者特殊的代码,以后可能会遇到问题?

在性能方面,我的理解是异常实际上减小了代码的正常执行路径的大小并提高了性能,但使异常/错误路径更加昂贵。 (常贵了不少 )。

因此,如果你唯一担心的是表现,我会说以后不用担心。 如果今天的CPU可以处理它,那么明天也会如此。

但是 在我看来,例外是那些需要程序员更聪明的是不是程序员可以合理预期的是时间的特点之一。 所以我说 - 如果你可以远离基于异常的代码。 远离。

看看Raymond Chen的Cleaner,更优雅,更难以识别 他说这比我做得好。

异常中最大的问题 - 它们没有可预测的执行时间。 因此它们不适合硬实时应用程序(我想大多数嵌入式应用程序都不属于这一类)。

第二个是(可能)增加二进制的大小。

我建议你阅读有关C ++性能技术报告,它专门针对您感兴趣的主题:在嵌入式(包括硬实时系统)中使用C ++,以及如何实现异常处理以及它具有哪些开销。

是否使用例外的选择应该取决于它们是否能够很好地适应您的程序的问题域。

我已经广泛使用了C ++异常,无论是在改造旧的C代码还是在一些较新的代码中。 (提示:不要试图重新安装在低内存环境中编写的具有各种不一致异常的20岁C代码。这只是一场噩梦)。

如果您的问题适合处理一个地方的所有错误(例如,某种类型的TCP / IP服务器,其中每个错误条件都满足'分解连接并再试一次'),那么异常就是好的 - 您可以在任何地方抛出异常,并且知道它将在何处以及如何处理。

另一方面,如果你的问题不适合中央错误处理,那么例外是一种皇家的痛苦,因为试图弄清楚某些东西(或者应该)被处理的东西很容易成为一种Sisyphean任务。 通过查看代码很难看到问题。 相反,您必须查看给定函数的调用树,并查看该函数的异常将在何处结束,以便确定您是否有问题。

如果运行时环境支持异常,我会说适当使用异常。 处理特殊情况的例外情况很好,并且根据实现情况可能会产生很少的开销。 某些环境不支持它们,尤其是在嵌入式环境中。 如果禁止它们,请小心解释原因。 我曾经有过一个人,当被告知不要使用例外情况时,他会做一个零除。 不完全是我们想到的。

我认为问题在于,许多人表达了他们的意见,却没有充分理解 C++ 中的异常处理是如何工作的。

我最近在一家新公司开始工作,大家一致认为我们不应该使用异常,因为我们无法测试它们,因为不确定的行为等等。当然,全错了。

当我们谈论在代码中使用异常处理的开销时,我们需要仔细考虑开销在什么之上? 当然,这是有代价的,但那是替代的成本吗? 假设我们正在使用返回错误代码。 在这种情况下,源代码中的 if() 语句的一半将专门用于测试错误代码并将它们转发到调用堆栈。 我正在查看的代码库的实际指标不是编造的。 其中大部分是处理 a) 几乎不可能发生的事件,例如在嵌入式应用程序开始时没有 memory 和 b) 如果它们真的发生了,我们无论如何也无能为力,其他比关机。

在这种情况下,引入异常处理将显着降低代码的复杂性,将罕见事件的处理与常规业务逻辑分开。 并节省了大量的开销,因为错误代码检查一直在进行。 此外,它显着减少了代码的大小。 想想需要多少努力才能通过 10 个不同的函数在堆栈中传播错误代码,直到我们到达可以正式保释的地方。 使用异常处理,您可以绕过 10 个中间级别的函数,并将 go 直接转到我们可以处理的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM