Has*_*hia 2 c c++ optimization gcc
在C或C++,如果编译器遇到一个for循环,其中一个计数器从计数0到n,并且n是可变的(不是函数调用,并且不是常数要么),将编译器通过检查优化循环,如果该变量n(该在循环期间(访问写入,例如:n可以是在循环之前计算的字符串的长度),将更改绑定变量),通过优化这里我的意思是将其值复制到寄存器以避免内存访问?
这是一个例子:
for (int c = 0; c < n; c++) {
// do something not related to n
}
Run Code Online (Sandbox Code Playgroud)
编译器会注意到并优化它吗?
c/c ++编译器会通过检查循环期间是否更改变量n(绑定变量)来优化循环
"as-if"规则允许编译器重新排序或重写代码,只要可观察的效果"好像"它执行了您编写的代码.
这里的关键字是"可观察的".除非可以证明n在执行循环体期间不能改变,否则循环必须重新评估c < n每次迭代.
如果编译器可以访问循环中的所有代码(例如,它在同一个编译单元中定义,或者全局优化在链接期间具有另一个外观,n则永远不会被引用或指针混淆)那么它可能在证明n不改变的立场.
在这种情况下,您不应该对以某种方式优化循环感到惊讶.