编译器构造 - 有没有办法在 c++ 中使用不会花费我 60k 的二进制大小的异常?
compiler construction - Is there a way to use exceptions in c++ that doesn't cost me 60k in added binary size?
我在一个嵌入式平台上工作,我不愿意在二进制文件中添加60k。无论如何,有一些论点可以避免嵌入式系统出现异常,但我认为大多数都是假的。例外是有道理的,但我无法证明目前的成本是合理的。我使用的是gcc 4.6.3,可能我缺少了一个选项,也可能这只是异常的开销。我尝试过-O,并将异常更改为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支持,主要是IMHO(到目前为止还没有通过实验证明这一点)。RTTI支持将导致对代码文本段的一些开销使用,尤其是在有大量模板实例化的情况下(例如,广泛使用各种类型的STL模板类/容器类)。
另一方面,与减少例如newlib所需实现的其他可能性相比,60k开销的成本并不那么高。
对于放弃异常支持,您真的应该三思而后行
有趣的是,我今天和同事们讨论了这个话题,当时我们面临的错误显然是由记忆不足引起的。有问题的固件(以及它与FreeRTOS的操作系统绑定)不支持异常,但如果无法使用new()
获取一定数量的堆内存,内存管理实现将触发处理器异常。使用某些STL诱导的算法可能会发生这种情况,并且您没有机会在失败时使用try/catch
块来拦截这种情况(例如使用简单的std::vector
)。
因此,您应该决定如何处理错误情况,而不使用异常或不使用异常,并确保提供一致的行为,例如使用常见的STL模式等,并将其与您为.text
节大小支付的成本进行权衡。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 有根的二进制搜索树.保留与其父级的链接
- 多态二进制函数
- 正在读取二进制文件(is_open)
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为什么二进制搜索在我的测试中不起作用
- 重载==不适用于二进制树
- 正在尝试重载二进制搜索树分配运算符
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 带有数组键C++的二进制映射
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 二进制数之和(使用C样式字符串)
- 如何从dicom文件中读取二进制数据
- 编译器构造 - 有没有办法在 c++ 中使用不会花费我 60k 的二进制大小的异常?