C编译器可以优化“for”循环中的“if”语句吗?

考虑一个这样的例子:

if (flag)
  for (condition)
    do_something();
else
  for (condition)
    do_something_else();

如果标志在for循环内部没有改变,这应该在语义上等同于:

for (condition)
  if (flag)
    do_something();
  else
    do_something_else();

只有在第一种情况下,代码可能会更长(例如,如果使用几个for循环,或者do_something()是与do_something_else())大致相同的代码块,则在第二种情况下,该标志将被检查许多倍。

我很好奇当前的C编译器(最重要的是,g)是否能够优化第二个例子,以摆脱for循环中的重复测试。如果是这样,在什么条件下这是可能的?

是的,如果确定标志不改变,do_something或do_something_else不能更改,则可以将其拉出循环。我听说过这个所谓的循环吊装,但维基百科有一个叫做“循环不变代码运动”的entry

如果flags是一个局部变量,则编译器应该能够进行此优化,因为它将保证对生成的代码的行为没有影响。

如果flags是全局变量,并且您在循环中调用函数可能无法执行优化 – 可能无法确定这些函数是否修改全局变量。

这也可能受到您所做的优化的影响 – 优化大小将有利于非悬停版本,而优化速度可能有利于升降版本。

一般来说,这不是您应该担心的事情,除非分析告诉您该函数是一个热点,并且您看到通过编译器输出的程序集实际上生成的效率较低的代码。像这样的微优化,你应该永远只留下编译器,除非你绝对必须。

http://stackoverflow.com/questions/1462710/can-c-compilers-optimize-if-statements-inside-for-loops

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:C编译器可以优化“for”循环中的“if”语句吗?