具有 const 条件的 if 语句是否在 for 循环内进行了优化(c++)

Is the if-statement with a const condition optimized inside a for loop (c++)

考虑以下代码:

void func(int a, size_t n)
{
  const bool cond = (a==2);
  if (cond){
    for (size_t i=0; i<n; i++){
      // do something small 1
      // continue by doing something else.
    }
  } else {
    for (size_t i=0; i<n; i++){
      // do something small 2
      // continue by doing something else.
    }
  }
}

在这段代码中,// continue by doing something else.(这可能是一个很大的部分,由于某些原因不能分成一个函数)完全相同地重复。为避免重复,可以这样写:

void func(int a, size_t n)
{
  const bool cond = (a==2);
  for (size_t i=0; i<n; i++){
    if (cond){
      // do something small 1
    } else {
      // do something small 2
    }
    // continue by doing something else.
  }
}

现在我们在(假设非常大的)for 循环中有一个 if 语句。但是 if 语句 (cond) 的条件是 const 并且不会改变。编译器会以某种方式优化代码(比如将其更改为初始实现)吗?有小费吗?谢谢

细节很重要,但你包含的太少了。当您要求编译器优化时,您需要知道编译器将根据假设规则进行优化。草率地说,只要不改变可观察的行为,编译器就可以进行任何优化(很少有例外)。您的两个函数都具有零可观察行为,因此打开优化后,gcc -O3,这就是编译器对它们所做的:

func(int, unsigned long):
        ret
func2(int, unsigned long):
        ret

推测编译器对您的代码做了什么是徒劳的。不要猜测,而是查看输出。您可以在此处执行此操作:https://godbolt.org/z/oznWz6.

PS:我不应该忘记包括的一些咒语:

不要过早优化。代码应该主要是为了供人类阅读而编写的。只有当您分析并有证据表明您可以通过改进该功能获得某些东西时,您才可以考虑以性能换取可读性。

另外不要忘记,您编写的代码不是 CPU 的说明。您的代码是对最终程序应该做什么的抽象描述。编译器非常了解如何重新排列代码以充分利用您的 CPU。通常它在这方面比人类可能做得更好。