我有一些循环的C代码:
for(int i=0; i<1000; i+=ceil(sqrt(i)))
{
do stuff that could benefit from loop unrolling;
}
我打算使用宏命令告诉GCC展开循环,但是我想确保在这种情况下确实会展开循环(因为增量不是1,但它仍然可以预处理和展开)。
是否有可能让GCC在优化后输出包含代码的.C文件? (希望包括它在组装级优化之前对-O
进行的任何优化)?
我知道我可以使用汇编输出来确认这一点,但我宁愿在C中看到一些东西 - 我更容易阅读和理解。
答案 0 :(得分:5)
C是一种高级编译语言。因此,它不是优化机器代码的适当表示。虽然,您可能觉得看到C代码更容易理解,但它缺乏程序集的绝对精度,它直接映射到机器代码。对于这个简单的例子,您可能非常清楚优化在高级语言方面意味着什么,但通常情况下优化并非如此。查看汇编语言可以准确显示编译器已完成的操作。
其次,编译器对某种intermediate representation (IR)执行优化,这类似于机器代码而不是高级代码(在本例中为C)。要在执行优化后输出高级代码,需要进行反编译步骤。 GCC不适合为很少使用的功能添加反编译逻辑。但是,如果确实希望在C中看到优化的代码,您可以通过反编译器运行GCC生成的程序集以获得高级代码。
简短回答:GCC不会做你想做的事,但你可以用装配反编译器从汇编中生成C代码。
Here is a stack overflow thread about choosing a good C decompiler for linux.