编译器优化


以GCC编译器为例,指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。参数 -O1、-O2、-O3 中,随着数字变大,代码的优化程度也越高,但是可调试性也会降低。

-Og 是在 -O1 的基础上,去掉了那些影响调试的优化,-Os 是在 -O2 的基础上,去掉了那些会导致最终可执行程序增大的优化,-Ofast 是在 -O3 的基础上,添加了一些非常规优化,这些优化是通过打破一些国际标准(比如一些数学函数的实现标准)来实现的,所以一般不推荐使用该参数。

编译器可以将你永远不会跑到的语句和变量在编译过程中丢弃,将你的if和switch嵌套逻辑调整到最简,甚至在警告里嘲笑你这个逻辑是无效的。所以如果你在调试的时候发现,程序并不会按照你设计的顺序执行,突然跳过某些语句,或者是某些变量无法被查看,大部分时候都是编译器优化造成的。

常用参数

-specs=nano.specs

-lc替换成-lc_nano,使有精简版的C库替代标准C库,可以减少最终程序映像的大小。但是精简C库缺少很多功能,比如printf中的浮点打印,可以用-u_printf_float单独开启。

-ffast-math

它允许编译器以失去标准合规性和一些安全性来加快浮点运算。比如假设任何浮点值既不是无限的也不是NaN,会导致isnan等函数失效。