使用GCC能否得到一个中间优化的C文件?

3

我有一些带有循环的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语言形式的输出——这对我来说更容易阅读和理解。

1
在GCC中,优化直到代码不再被识别为C之后才会发生,因此这可能是不可行的。但是,如果您学会阅读中间代码,就可以告诉GCC在各个阶段保存临时文件... - twalberg
1个回答

5
C是一种高级编译语言,因此不适合作为优化机器代码的适当表示。尽管您可能觉得查看C代码更容易理解,但它缺乏汇编的绝对精度,而汇编直接映射到机器代码。对于这个简单的例子,您可能已经相当了解高级语言中优化的含义,但是对于优化来说通常情况下并非如此。查看汇编语言可以准确地显示编译器所做的操作。
其次,编译器对某种中间表示(IR)执行优化,该表示更类似于机器代码而不是高级代码(在这种情况下为C)。在执行优化后输出高级代码需要进行反编译步骤。 GCC不是添加反编译逻辑以实现这种很少使用的功能的适当位置。但是,如果您真的想要查看优化后的C代码,可以通过反编译器运行GCC生成的汇编代码以获取高级代码。
简短回答:GCC不能做到您想要的,但是您可以通过反汇编器从汇编中生成C代码。

这里有一个关于如何选择适合Linux的好C反编译器的Stack Overflow讨论串。


谢谢(还有twalberg)。我从未深入学习编译器以了解具体细节。 - user1999728

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接