调试问题:任何级别的优化都将带来代码结构的改变。例如:对分支的合并和消除,对公用子表达式的消除,对循环内load/store操作的替换和更改等,都将会使目标代码的执行顺序变得面目全非,导致调试信息严重不足。 内存操作顺序改变所带来的问题:在O2优化后,编译器会对影响内存操作的执行顺序。例如:-fschedule-insns允许数据处理时先完成其他的指令;-fforce-mem有可能导致内存与寄存器之间的数据产生类似脏数据的不一致等。对于某些依赖内存操作顺序而进行的逻辑,需要做严格的处理后才能进行优化。例如,采用volatile关键字限制变量的操作方式,或者利用barrier迫使cpu严格按照指令序执行的。 精简指令操作带来的精度问题:编译优化,会精简指令操作,将某两条指令合并成一条指令等。在数学计算中,先后计算会带来精度不一致的问题。比如计算公式A*B-C*D,我们希望先计算C*D,再计算A*B,最后计算减法,于是代码中用两个乘法和一个减法指令实现此功能,然而编译器会将此三条指令优化成两个指令,即一个乘法指令和一个乘减指令。从而会先计算A*B =X,再计算X-C*D,此类问题在双精度的浮点计算时,会有较大的精度差异。 |
说点什么...