希望不是一个愚蠢的问题。
编译时未指定优化: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
答案 0 :(得分:3)
关闭优化后,源代码和机器代码之间会有1:1的表示,从而可以更轻松地进行调试。启用优化后,编译器可以执行一些奇怪的操作,例如重新排列代码或删除使调试代码更加困难的变量。
使用-O0
进行编译通常也会更快,因为优化器通常是每个现代编译器中最慢的组件。