杰里说:...结果不再是C ++了,而我的隐喻是它显然是 C ++,只是略有不同的方言,因为程序利用了其他形式,约定和书面样式。
这是我禁用它们的主要原因:
二进制兼容性
跨越语言和翻译的界限并不是普遍定义明确或不确定的。如果要保证程序在定义的行为范围内运行,则需要在模块出口处隔离异常。
可执行文件大小
这是我编写的无异常程序的二进制大小,该程序在不启用和启用异常的情况下构建:
无例外:
- 可执行文件+依赖项:330
- 最终剥离的可执行文件(发布版本):37
例外情况:
- 可执行文件+依赖项:380
- 最终剥离的可执行文件(发布版本):44
提醒:这是包含零抛出/捕获的库和程序的集合。编译器标志确实启用了C ++标准库中的异常。因此,在此示例中看到的实际成本超过19%。
编译器:apple gcc4.2 + llvm。大小以MB为单位。
速度
尽管有术语“零成本例外”,但即使没有抛出任何异常,它们仍然会增加一些开销。在上述情况下,它是一个性能至关重要的程序(信号处理,生成,演示,转换,以及大数据集/信号等)。异常不是此设计中的必要功能,而性能非常重要。
程序正确性
似乎是一个奇怪的原因...如果不能选择抛出,则必须编写相对严格,正确,经过良好测试的程序,以确保您的程序正确执行,并且确保客户端正确使用接口(如果给我一个错误的参数或而不检查错误代码,则应得到UB)。结果?实现质量大大提高,问题很快得到解决。
简单
异常处理实现并不经常保持最新。它们还增加了很多复杂性,因为实现可能具有许多许多退出序列。当程序使用一小组定义良好,类型明确的退出策略,这些策略冒泡到客户端并由客户端处理时,则更易于阅读和维护。在其他情况下,随着时间的推移,这些实现可能会实现更多的抛出,或者它们的依赖性可能会引入它们。客户无法轻易或适当地防御所有这些退出。我编写和更新了很多库,并且有频繁的发展和改进。尝试使所有异常与异常退出序列(在大型代码库中)保持同步不会很好地利用时间,并且可能会增加很多噪音和混乱。由于提高了程序的正确性和更多的测试,
历史/现有代码
在某些情况下,由于历史原因从未引入过它们。现有的代码库没有使用它们,因为约定和实现方面的重叠,更改程序可能要花很多年的时间,并且很难维护。
缺点
当然,也有缺点,最大的缺点是:与其他库的不兼容性(包括二进制),以及您必须实施大量程序以适合此模型的事实。