【发布时间】:2017-03-28 16:10:30
【问题描述】:
希望不是一个愚蠢的问题。
编译时未指定优化:gcc test.c -o test(似乎选择了-O0)。
gcc -O2 或 -O3 输出的汇编代码比 -O0 更清晰(至少在我看来)。
-O0的原因是什么,它对我们有什么帮助,我看不出它比-O1或-O2简单。
...
int sum(int x, int y)
{
int sum = x + y;
return sum;
}
...
0x00000000004004ed <+0>: push %rbp
0x00000000004004ee <+1>: mov %rsp,%rbp
0x00000000004004f1 <+4>: mov %edi,-0x14(%rbp)
0x00000000004004f4 <+7>: mov %esi,-0x18(%rbp)
0x00000000004004f7 <+10>: mov -0x18(%rbp),%eax
0x00000000004004fa <+13>: mov -0x14(%rbp),%edx
0x00000000004004fd <+16>: add %edx,%eax
0x00000000004004ff <+18>: mov %eax,-0x4(%rbp)
0x0000000000400502 <+21>: mov -0x4(%rbp),%eax
0x0000000000400505 <+24>: pop %rbp
0x0000000000400506 <+25>: retq
【问题讨论】:
-
它更直接地映射到源代码。
-
一些安全关键应用程序,如汽车、飞机或医疗等,可能会要求他们不需要优化,因为很难验证编译器输出是否与源输入正确匹配。它是一个移动的目标,如果没有优化,理想情况下,可以验证工具链,或者相对更容易,或者二进制文件中有更多的舒适度。
-
同样不用优化也可以通过去掉优化死代码的代码进行调试、单步等,部分代码可能会重新排列,高层和底层没有一一对应的关系输出,所以你不一定要步进,你不一定要查看内存或变量等。