有没有碰到过这样的情况,用-O0优化选项编译程序是正常的,换成-O2优化选项编译程序就有bug呢?或者反过来,-O2编译正常,-O0编译有bug。
mingdu.zheng at gmail dot com
https://blog.csdn.net/zoomdy/article/details/79397591
提高优化级别后可能引起的问题
例如从O0变更为O2。
- 编译乱序引起的问题,程序当中没有放置正确的内存屏障,编译优化引起的乱序执行导致程序出现bug。
- 时序引起的问题,优化后的代码执行速度要比优化前快得多,这可能引起时序不符合要求,最终导致bug。
降低优化级别后可能引起的问题
例如从 O2变更为O0。
- 可能引起堆栈溢出,O0使用的堆栈空间比O2要多,使用O2堆栈不会溢出,切换成O0可能会引起堆栈溢出。
- 时序引起的问题,变慢仍然可能会引起问题。
如何避免
- 不能假设执行次序和程序代码次序相一致,编译优化会打乱执行次序以减少数据相关性,如果要求程序按代码次序执行,那么应该在代码内插入内存屏障告知编译器不要打乱此处的执行次序。
- 和时序相关的操作要避免使用指令延时,应当使用定时器。