假设存在与设置恢复点相关的成本,可以优化循环,如下所示:
while (doContinue) {
try {
doSomeWork ();
}
catch (...) {}
}变成类似这样的东西:
while (doContinue) {
try {
do {
doSomeWork ();
} while (doContinue);
break;
} catch (...) {}
}但如果平台支持零成本异常处理,这种优化就没有任何意义。
有人能告诉我零成本异常处理是如何在不同的体系结构上实现的吗?有没有办法弄清楚编译器/代码生成器在编译时可以使用哪些底层机制来决定是否像这样优化。例如,如果编译器可以假设doSomeWork ()没有与循环相关的副作用,那么编译器是否可以为您优化它?
发布于 2011-02-14 03:42:42
仅当可用于正在使用的目标时,才能使用零成本方法。如果可用,大多数生产质量的C++编译器都会使用它。否则,编译器将使用setjmp/longjmp方法。
setjmp/longjmp的执行速度较慢。
然而,即使使用setjmp/longjmp方法,使用异常机制也可以产生比检查每个函数的返回代码更高的性能,例如在问题中的双循环优化。
要确定target是否支持零成本方法,以及编译器是否正在使用它,唯一的方法是将C++代码转换为汇编并对其进行分析。另一种解决方案是使用--RTS=zcx调用gnat并检查错误(如果gnat可用)。但这并不能保证它会被C++编译器使用。
因此,一般来说,如果程序大小不是问题,并且存在零成本异常,那么使用异常来处理意外情况要比检查每个函数的返回代码要好得多。否则,在某些情况下,可以使用异常来优化代码。
使用,但不要滥用!
附言:我最终写了一个关于这个的article。
发布于 2011-02-12 12:02:30
我认为你高估了“零成本”的含义。下面是它的LLVM doc;它的主要作用似乎是异常和上下文处理代码是在编译时构建的,因此在运行时没有额外的成本,而执行正常进行,成为时空权衡。在您的示例中,我相信会生成两倍的“着陆板”,增加大小并减慢异常处理。
https://stackoverflow.com/questions/4975504
复制相似问题