是否可以使用GCC获得中间的,优化的C文件?

use*_*728 3 c optimization gcc

我有一些循环的C代码:

for(int i=0; i<1000; i+=ceil(sqrt(i)))
{
    do stuff that could benefit from loop unrolling;
}
Run Code Online (Sandbox Code Playgroud)

我打算使用宏命令告诉GCC展开循环,但我想确保在这种情况下确实会展开循环(因为增量不是1,但它仍然可以预处理和展开).

是否有可能让GCC在优化后输出包含代码的.C文件?(希望包括-O在组装级优化之前进行的任何优化)?

我知道我可以使用汇编输出来确认这一点,但我宁愿在C中看到一些东西 - 我更容易阅读和理解.

dow*_*eat 5

C是一种高级编译语言.因此,它不是优化机器代码的适当表示.虽然,您可能觉得看到C代码更容易理解,但它缺乏程序集的绝对精度,它直接映射到机器代码.对于这个简单的例子,您可能非常清楚优化在高级语言方面意味着什么,但通常情况下优化并非如此.查看汇编语言可准确显示编译器的功能.

其次,编译器对某种中间表示(IR)执行优化,这种机器代码比高级代码(在本例中为C)更类似于机器代码.要在执行优化后输出高级代码,需要进行反编译步骤.GCC不适合为很少使用的功能添加反编译逻辑.但是,如果你真的想在C中看到优化的代码,你可以通过反编译器运行GCC生成的程序集来获取高级代码.

简短的回答:GCC不会做你想要的,但是你可以使用反编译器从汇编中生成C代码.

这是一个关于为linux选择一个好的C反编译器的堆栈溢出线程.