![]() |
1
2
我认为被接受的答案即使不是错的,也是毫无意义的,所以即使在这么多年之后,我仍然觉得有必要给出一个正确的答案。 猜测编译器实现者为什么选择不在任何特定的特性上下功夫只是,好吧。。。投机。只有在异常情况下才会抛出异常这一事实通常不会被认为是不优化此类代码性能的原因。相反,即使抛出代码确实没有得到优化 此外,这段代码可能会让人觉得很做作,不值得考虑,但事实并非如此:它可能是对更复杂的代码进行内联和优化的结果,而优化它可能会导致生成更简单的代码,从而允许其他优化传递启动,或者进一步内联包含函数。像这样的优化过程,当正确且有效地实现时,总是值得至少考虑的,不管原始代码看起来有多么做作。否则,即使是像 将被避免,因为“死代码不应该写在第一位”。显然不是这样。
原因纯粹是技术性的,这封来自clang development邮件列表的电子邮件对此进行了解释: http://lists.llvm.org/pipermail/cfe-dev/2015-March/042035.html
因此,考虑操作代码:
对于编译器来说,
要确保不是这样,就需要“完整的程序知识”,如上面的电子邮件中所写。更简单的案例 能够
以上代码
变成
godbolt
). 这一次,我们可以从一个实际的来源,上面链接的电子邮件中看出,Clang开发人员(我们不能对其他编译器说什么)认为这种优化不值得,
可能
因为它只适用于
|
![]() |
2
5
因为
至于你的第二个例子,编译器可以做到这一点,但它必须被视为一个特殊的情况,所以为什么要费心这样一个病态的情况? |
![]() |
3
5
因为C++异常是为了, 特殊情况下的情况和表现并不重要。 考虑到C++异常的情况下,确保编译器供应商可以在常见的情况下,在没有抛出异常的情况下提供接近最优的性能,而代价是比抛出异常时的奇数情况下的性能更差。
从一开始,我们就鼓励用户仅在异常情况下使用异常,并鼓励实现人员优化无异常情况(必须将析构函数地址存储在某个位置,以便在出现异常时调用析构函数),代价是以异常情况为代价。
|
|
lfox · 如果列中不存在某个值,则停止代码执行 2 年前 |
![]() |
zaen · 将值传递到异常字符串消息中 2 年前 |
![]() |
Zephyr · 如何在双ListView选择系统上实现过滤器? 7 年前 |
![]() |
Aave · 错误数组长度的特定异常 7 年前 |