【发布时间】:2017-01-27 02:58:27
【问题描述】:
在 C 或 C++ 中,如果编译器遇到 for 循环,其中计数器从 0 计数到 n,并且 n 是一个变量(不是函数调用,并且 NOT一个常量),编译器是否会通过检查变量n(绑定变量)是否会在循环期间更改来优化循环(访问以进行写入,例如:n 的长度可以是在循环之前计算的字符串),这里通过优化是指将其值复制到寄存器以避免内存访问?
这是一个例子:
for (int c = 0; c < n; c++) {
// do something not related to n
}
编译器会注意到并优化它吗?
【问题讨论】:
-
试试看。 (填..)
-
我猜也取决于编译器。去这里看看会发生什么:gcc.godbolt.org
-
尝试使用
-O0、-O1或-O2编译您的代码,看看GCC 在这些选项中的表现如何 -
另外,取决于你在 for 循环中所做的事情,如果它没有明显的副作用,它可以优化整个事情。
-
必须真正确定这样的变量没有改变;如果
n既不是局部变量也不是内部链接变量(例如,它是全局或对象字段)并且循环体调用函数(特别是在其他 TU 中定义的函数),编译器极难执行这种优化(也许使用 LTCG)。这就是为什么通常在这些情况下您要确保循环限制变量是本地变量。
标签: c++ c gcc optimization