0x00 前言
众所周知,gcc有优化标记-O,可以选择优化等级,针对每个等级,会打开不同的优化开关。也可以手动去选择打开这些开关。详细的描述可以去查看gcc手册(https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html),此处不再赘述。
本文想给出一个很直观的例子,并通过汇编来分析gcc是如何做优化的,对编译优化有一个简单的理解。
0x01 实验程序
先看代码,递归1000000次后打印2000000:
静态分析来讲,这个程序会因为因为递归的次数过多,栈不停的增长导致内存写坏,然后segfault。
试验一下,不出所料:
0x02 实验结果
试试看,对他进行不同程度的优化,结果会有什么变化:
可以看到,O2以上是可以打印出我们期望的结果的,继续分析一下O1和O2之间发生了什么。