gcc优化选项解析
1 -fno-defer-pop
函数返回的时候,就立即将栈里面放置的该函数的参数pop出来。这样可以避免函数参数占用过多的栈空间。
2 -fforward-propagate
?
3 -ffp-contract=style
floating point expression contract,这个是FMA,fused multipy add
用于计算x*y + z,其中x、y、z都是浮点数。有的处理器实现了fma指令。
c99里面通过提供fma函数来支持fma。
fma的特点是可以使得这种模式的浮点计算更快精度更高。
普通的x*y + z用了两次rounding,第一次在计算x*y之后,会进行rounding,然后在和z相加,得到的结果再一次rounding。而使用fma计算的话,只会rounding一次,因此精度更高。
4 -fomit-frame-pointer
不要frame pointer,这样就可以减少每个函数保存frame pointer和恢复frame pointer的指令,加快程序的执行,毕竟这些指令都是要访问内存的。
但是,backtrace就用不了了。
5 -foptimize-sibling-calls
这个选项会对sibling call,tail recursive call进行优化。首先,直接用jmp指令而不用call指令,这样的话,被掉用函数执行完后,不需要再跳回调用函数。其次,被调用函数直接用调用函数的栈,这样可以有效的节省内存空间,并且可以防止出现栈溢出。因为由于是sibling call,是调用函数执行的最后一条指令,并且栈空间足够大,留着原来的栈空间是没有用的,返回更是没有意义的,因此可以这样进行优化,但是问题是,如果f调用b,现在断在b中,想要去查看f的局部变量就查看不了了。
6 -foptimize-strlen
就是对c里面的字符串处理函数strlen、strcpy等进行优化,使之执行的速度更快。