[英]What exactly happens when -O3 is set
我有以下代码:
int main()
{
int i=0;
for(i=0;i<10000000;i++)
//do something
return 0;
}
当我使用'gcc -o file file.c'命令运行此代码时,它在244毫秒内被执行,而当我使用'gcc -O3 file.c -o file'执行相同的代码时,它在0被执行。毫秒(很少的时间显示为零)。 我无法理解-O3标志以何种方式进行了优化,以至于我们获得了很大的执行速度。
关于'-O3'优化的任何链接,文档或解释(除了gcc.gnu.org,我已经看到并发现给出的信息不足以为我提供像样的解释和对发生的事情的深刻理解)很多赞赏。
最终,我们需要知道//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;
}
在打开和关闭优化的情况下对其进行编译,并检查文件大小,甚至将其置于compile选项中以生成汇编代码。 通常,启用优化后,由于循环展开,代码大小可能会变大。 尽管由于主体什么都不做,所以可以优化代码。 也许使用易失性循环计数器以确保未对其进行优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.