我正在嵌入式平台上工作,我不习惯向我的二进制文件添加 60k。 无论如何,有一些论据可以避免嵌入式系统上的异常,但我认为其中大多数都是虚假的。例外是有道理的,但我无法证明目前的成本是合理的。我正在使用 gcc 4.6.3,也许我缺少一个选项,或者这可能只是异常的开销。我尝试过 -Os,并将例外更改为 longjmp,但无济于事。我可能错过了什么。
感谢您的任何见解。
-fno-exceptions
关闭 GCC 中的异常。
但是,鱼与熊掌不可兼得。关闭异常意味着您无法捕获它们,并且如果您链接到使用异常编译的代码,它也会中断。但它确实按照您的预期减少了二进制大小。
没有异常的代码(但具有相同级别的错误检查)是丑陋的,但这是你必须付出的代价。
C 语言中可爱的无异常健壮代码示例:)
error_t foo(void) {
if (!do_foo()) {
error_code = E_FOO;
goto bail;
}
if (!do_bar()) {
error_code = E_BAR;
goto bail;
}
/* repeat 100 times */
bail:
cleanup();
return error_code;
}
第一,不!
异常处理需要一些成本,主要是需要 RTTI 支持,恕我直言(到目前为止还没有通过实验证明这一点)。 RTTI 支持将导致代码文本段的使用产生一些费用,尤其是在存在大量模板实例化的情况下(例如,广泛使用具有多种类型的 STL 模板类/容器类)。
另一方面,与其他减少的可能性相比,例如newlib需要实现,60k开销的成本并没有那么多。
您真的应该三思而后行,不要放弃异常支持!
有趣的是,今天我和同事讨论了这个话题,当时我们遇到了一个显然是由内存不足情况引起的错误。有问题的固件(及其与 FreeRTOS 的操作系统绑定)不支持异常,但如果无法使用
new()
获取一定量的堆内存,内存管理实现将触发处理器异常。使用某些 STL 引发的算法可能会发生这种情况,并且您没有机会在失败时使用 try/catch
块来拦截此情况(例如使用简单的 std::vector
)。
因此,您应该决定如何处理错误情况,是否使用异常,并确保提供一致的行为,例如常见 STL 模式等的使用,并从您为
.text
部分尺寸支付的成本中权衡这一点。