设置-O3时到底发生了什么

时间:2015-09-28 11:05:11

标签: c gcc compiler-construction

我有以下代码:

int main()
{
int i=0;
for(i=0;i<10000000;i++)
        //do something
return 0;
}

当我使用&#39; gcc -o file file.c&#39;运行此代码时命令,它在244毫秒内执行,当我使用&#39; gcc -O3 file.c -o file&#39;执行相同的代码时它在0毫秒内执行(非常小的时间显示为零)。我无法理解-O3标志做了什么优化,以便我们在执行中获得很多速度。

关于&#39; -O3&#39;的任何链接,文档或解释。优化(除了gcc.gnu.org,我已经看到并发现给出的信息不足以为我提供一个很好的解释和对发生的事情的洞察力)非常感谢。

1 个答案:

答案 0 :(得分:1)

最终我们需要知道什么 //do something。您应该粘贴您使用的确切代码,因为从技术上讲,return语句将作为循环体执行。

如果你有这样的事情:

int main()
{
    int i=0;
    int junkInteger = 0;
    for(i=0; i < 5 ;i++)
    {
        junkInteger++;  // just to have a body
    }
    return 0;
}

通过优化,您的循环可能会像这样展开,从而导致代码大小变大。

int main()
{
    int i=0;
    int junkInteger = 0;

    // loop gets unrolled
    junkInteger++;
    junkInteger++;
    junkInteger++;
    junkInteger++;
    junkInteger++;
    return 0;
}

当循环展开时,低级程序集/机器代码不必执行加载,存储,比较和分支来管理循环。

您应该再次尝试使用此代码:

int main()
{
    int i=0;
    for(i=0;i<10000000;i++)
    {
        //do something
    }
    return 0;
}

使用优化开启和关闭编译它并检查文件大小,甚至放入编译选项以生成汇编代码。通常在启用优化的情况下,由于循环展开,代码大小会变大。虽然代码可以优化,因为身体什么都不做。也许使用易失性循环计数器来确保它没有被优化。