这个问题对于嵌入式开发尤其重要。异常处理为生成的二进制输出增加了一些占用空间。另一方面,毫无例外,错误都需要以其他方式处理,这需要额外的代码,最终也会增加二进制大小。
我对你的经历很感兴趣,尤其是:
- 您的编译器为异常处理添加的平均占用空间是多少(如果您有这样的测量)?
- 就二进制输出大小而言,异常处理真的比其他错误处理策略更昂贵吗?
- 对于嵌入式开发,您建议采取什么错误处理策略?
请仅将我的问题作为指导。欢迎任何意见。
附录:是否有人有一种具体的方法/脚本/工具,对于特定的 C++ 对象/可执行文件,将显示编译器生成的代码和专用于异常处理的数据结构占用的已加载内存占用量的百分比?
当出现异常时occurs将会有时间开销,这取决于您如何实现异常处理。但是,据传闻,使用任何其他方法处理应导致异常的事件的严重性将花费同样多的时间。为什么不使用高度支持的基于语言的方法来处理此类问题呢?
GNU C++ 编译器默认使用零成本模型,即在不发生异常时没有时间开销。
由于有关异常处理代码和本地对象偏移量的信息可以在编译时计算一次,因此此类信息可以保存在与每个函数关联的单个位置,但不能保存在每个 ARI 中。您实质上消除了每个 ARI 的异常开销,从而避免了将它们推入堆栈的额外时间。这种方法称为异常处理的零成本模型,前面提到的优化存储称为影子堆栈。 - Bruce Eckel,《C++ 思考》第 2 卷
大小复杂性开销不容易量化,但 Eckel 表示平均为 5% 和 15%。这将取决于异常处理代码的大小与应用程序代码的大小之比。如果您的程序很小,那么异常将占二进制文件的很大一部分。如果您使用零成本模型,则异常将占用更多空间来消除时间开销,因此,如果您关心空间而不是时间,则不要使用零成本编译。
我的想法大多数嵌入式系统都有足够的内存,如果您的系统有 C++ 编译器,您就有足够的空间来包含异常。我的项目使用的 PC/104 计算机有几 GB 辅助内存、512 MB 主内存,因此不存在例外的空间问题 - 不过,我们的微控制器是用 C 语言编程的。我的启发是“如果有一个主流 C++ 编译器它,使用异常,否则使用 C”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)