有没有一种方法可以在 C++ 中使用异常,而不会增加我 60k 的二进制大小?

问题描述 投票:0回答:2

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

感谢您的任何见解。

c++ exception embedded
2个回答
3
投票

您可以使用

-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;
}

2
投票

第一,不!

异常处理需要一些成本,主要是需要 RTTI 支持,恕我直言(到目前为止还没有通过实验证明这一点)。 RTTI 支持将导致代码文本段的使用产生一些费用,尤其是在存在大量模板实例化的情况下(例如,广泛使用具有多种类型的 STL 模板类/容器类)。

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

您真的应该三思而后行,不要放弃异常支持!

有趣的是,今天我和同事讨论了这个话题,当时我们遇到了一个显然是由内存不足情况引起的错误。有问题的固件(及其与 FreeRTOS 的操作系统绑定)不支持异常,但如果无法使用

new()
获取一定量的堆内存,内存管理实现将触发处理器异常。使用某些 STL 引发的算法可能会发生这种情况,并且您没有机会在失败时使用
try/catch
块来拦截此情况(例如使用简单的
std::vector
)。

因此,您应该决定如何处理错误情况,是否使用异常,并确保提供一致的行为,例如常见 STL 模式等的使用,并从您为

.text
部分尺寸支付的成本中权衡这一点。

© www.soinside.com 2019 - 2024. All rights reserved.