为什么程序员会有代码能跑就不要动的观点?
等你见识到:
1.结构体或者类里有一个没卵用的成员或者一个毫无用处的方法,代码里没有任何一个地方用到它,但删除它会导致运行时错误。(非 常 经 典)
2.编译代码开O1正常,开O3段错误。
3.编译代码开O1正常,开O3能跑,但结果不对。
4.换一个编译器就编译不过。
5.换一个编译器就运行结果不对。
6.换一台电脑就运行结果不对。
7.浮点数运算次序变化导致结果出错。比如我见过一个在英特尔编译器上编译的代码,一组浮点运算里面输出了一下中间结果,这个中间结果和最终输出的结果是符合数学预期的,但是把这个输出中间结果的语句删除以后最终结果就不符合数学预期了,该代码一度被称为薛定谔的代码(你观测了它的中间过程,它的结果就正确,你不观测就不正确)。最后发现原因是英特尔编译器默认使用快速浮点运算优化,会假设浮点数满足结合律,插输出代码以后以后编译器认为此处做优化没有收益(输出到屏幕其实是一个很罗嗦的一大坨的函数),老老实实算。把输出代码删掉以后编译器发现这里可以优化一下,上了向量优化和FMA优化,变换了运算次序导致结果出错。有人说你改fpmodel就行,但那个代码开fast-math加速超过20%,绝大多数地方误差都可以容忍,对部分无法容忍的结果误差最好还是改代码解决,或者分离到一个编译模块里面用单独的编译选项。
8.改一个有很多儿子和孙子的基类。
9.改变程序的线程同步模型、内存模型、缓冲区模型。
10.在不清楚程序算法的前提下改变算法上具有强关联的一组函数中的某一个,在本函数中你没有看出任何bug,但其实前后依赖的某些assert已经被破坏了,导致严重和难以排查的算法逻辑bug。
11.一些很不规范的、不遵守变量生存期约定的python、bash代码。比如说在一堆if-else里面定义了某个值并且在if-else的外面使用,脚本语言通常允许你这么做,但是当你改了if-else条件导致某些情况下抵达使用变量的地方时变量还没被定义,你就会喜提一个报错。
12.各种千奇百怪的暗藏隐式转换、副作用语句(比如一大堆的各种++)、递归、数据类型溢出的代码。
以及其他等等的时候你就明白了。
