【发布时间】:2014-08-05 01:03:38
【问题描述】:
在这个question中,我遇到了gcc myfile.c -S产生的汇编代码比gcc myfile.c -O0好但比gcc myfile.c -O1差的情况。
在 -O0 时,会生成两个循环。在 -O1 处,两个循环都被优化了。 (感谢@Raymond Chen 的提醒。引用自他的 cmets)(使用 -S 只是优化 一个循环)
我在网上搜索,只找到这个:
-S(引自Overall options)
在适当的编译阶段之后停止;不要组装。对于每个指定的非汇编输入文件,输出采用汇编代码文件的形式。
默认情况下,源文件的汇编文件名是通过将后缀“.c”、“.i”等替换为“.s”。
不需要编译的输入文件将被忽略。
所以我的问题是:
-S选项在编译文件时的优化级别到底是多少? (-O0.5?)为什么不直接使用
-O0或-O1...(或者这是一个错误?)
编辑:您可以使用此site 来帮助您重现问题。代码在我提到的question 中。 (如果你只使用 -S 编译器选项(或不使用编译器选项),你可以获得一个循环省略。)
第 1 步:
打开此site 并在 Code Eidtor 中复制以下代码。
#include <stdio.h>
int main (int argc, char *argv[]) {
unsigned int j = 10;
for (; j > -1; --j) {
printf("%u", j);
}
}
第 2 步:
选择g++ 4.8 作为编译器。 编译器选项为空。(或-S)
第三步:
你得到第一种情况。现在,将j > -1 更改为j >= -1 即可看到第二个。
【问题讨论】:
-
-S 不控制优化,它由 -O 开关控制,所以你看到的不应该发生。我也无法重现这一点。请发布一些代码和您用来重现此行为的确切命令。
-
@nos 在这个站点(gcc.godbolt.org),你可以在那个问题中尝试我的代码。如果我把那些代码贴在这里,不会重复吗?
-
@Tony: 这是 GCC 的哪个确切版本?
-
在上面的网站上你选择了哪个 GCC 版本(网站默认为 clang!)?
-
@Tony 当您发布确切的代码和重现问题的确切步骤时,通常会容易得多,而不是将我们发送到其他问题和网站。我无法重现你的结果,我不知道你做了什么来产生这些结果。
标签: gcc optimization assembly