有没有办法在c ++中使用异常,并不会花费额外的二进制大小60k?

时间:2013-02-07 21:43:11

标签: c++ compiler-construction exception-handling embedded

我正在使用嵌入式平台,我不习惯在我的二​​进制文件中添加60k。无论如何,有一些论据可以避免嵌入式系统的异常,但我认为它们中的大多数是虚假的。例外是有道理的,但我无法证明其成本是合理的。我正在使用gcc 4.6.3,也许我错过了一个选项,或者这可能只是异常的开销。我已经尝试过-Os,并将例外更改为longjmp,但无济于事。我可能错过了一些东西。

感谢您的任何见解。

2 个答案:

答案 0 :(得分:2)

在第1天,没有!

异常处理需要一些成本,主要是要求RTTI支持主要是恕我直言(到目前为止尚未通过实验证明)。 RTTI支持将导致代码文本段的一些费用使用,特别是如果有很多模板实例化(例如,广泛使用STL模板类/容器类以及许多不同类型)。

另一方面,与其他可能性相比,例如newlib需要实现,60k开销的成本并不是那么多。

你真的应该三思而后行,让异常支持去了!

有趣的是,我今天和我的同事讨论了这个话题,当时我们面临的错误显然是由内存不足引起的。有问题的固件(以及它与FreeRTOS的操作系统绑定)不支持异常,但如果使用new()无法获取一定数量的堆内存,则内存管理实现会触发处理器异常。使用某些STL引发的算法可能会发生这种情况,并且您无法使用try/catch块在失败时拦截此情况(例如使用简单的std::vector)。

因此,您应该决定如何处理错误情况,不使用或不使用异常,并确保提供一致的行为,例如:使用常见的STL模式等,并权衡您为.text部分大小支付的费用。

答案 1 :(得分:2)

您可以使用-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;
}