使用noexcept和关闭异常的编译器标志

Smi*_*ken 2 c++

介绍

在嵌入式c ++中,尤其是在实时系统中,不需要处理异常,并且如果系统将崩溃,通常的做法是让它崩溃。每次崩溃都是程序员错误,必须解决。因此,无需在发行版中处理异常。

问题

使用说明noexcept符可以显着减少二进制文件的大小并提高性能。这样,stl具有的函数中的每个函数(noexcept如果有)将调用noexcept重载。但是该说明符的使用是限制性的,并且有很多限制(继承,虚拟函数签名,兼容性)。如果您在没有适当集成的情况下修改源代码,则会出现类似的错误looser throw specifier for...

没有异常标志(如g ++ -fno-exceptions)仅替换所有标志throwabort并可能减小某些堆栈大小。

在有noexcept必要升级旧版代码(在c ++ 11之前),提高性能并减小二进制文件大小的情况下,是否有任何良好的做法如何使用说明符或标志?现在,我只能看到一种方法-添加noexcept到每个函数。

编译器(arm-none-eabi-g ++,C ++编译器MSVC),c ++ 14

Jon*_*ely 6

这样,如果函数中的每个stl函数可用,noexcept它将调用noexcept重载。

不,因为您不能在上重载noexcept。用标记函数noexcept不会影响其调用的函数的重载解析。

标记函数的大小减少noexcept是因为编译器不需要发出用于堆栈展开和异常处理的代码,它可以终止。但是,如果使用-fno-exceptions编译器,也不必发出用于堆栈展开和异常处理的代码,因此您应该获得相同的好处(无需在noexcept任何地方添加)。

noexcept在需要升级旧代码(在c ++ 11之前),提高性能和减小二进制文件大小的情况下,是否有任何良好的做法如何使用说明符或标志?

优良作法是只添加noexcept绝对不会抛出的函数,并且永远不会更改为抛出,或者如果std::terminate确实发生异常则绝对希望它们调用。

这并不意味着将其添加到每个函数中。

这也不意味着会不小心将其添加到虚拟函数中。这样做会更改基类的协定,并且需要更新所有替代。