c是否优化了for循环的检查部分?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c是否优化了for循环的检查部分?相关的知识,希望对你有一定的参考价值。

使用以下代码实际调用min函数的次数

for (int i = 0; i < min(size, max_size); i++) {
   //Do something cool that does not involve changing the value of size or max size
}

编译器会注意到他们只能计算最小值并注册它,还是应该在进入循环之前显式创建一个变量来保存值?哪种语言可以优化这个?

作为一个扩展,如果我是一个面向对象的语言与类似的循环,除了它看起来更像这样

for (int i = 0; i < object.coolFunc(); i++) {
   //Code that may change parameters and state of object but does not change the return value of coolFunc()
}

什么会优化?

答案

任何好的编译器都会优化for循环的控制表达式,只需一次评估其中的明显不变的子表达式,只要启用优化即可。这里,“不变”意味着在循环执行时子表达式的值不会改变。 “可见”意味着编译器可以看到表达式是不变的。有些东西会干扰这个:

  • 假设,在循环内部,调用了一些函数,并将size的地址作为参数传递。由于该函数具有size的地址,因此可以更改size的内容。也许函数不会这样做,但编译器可能无法看到函数的内容。它的源代码可以在另一个文件中。或者函数可能如此复杂,编译器无法对其进行分析。然后编译器无法看到size没有改变。
  • min不是标准的C函数,因此您的程序必须在某处定义它。如上所述,如果编译器不知道min做了什么,或者它是否太复杂而无法编译器进行分析(在这种情况下不太可能,但一般情况下),编译器可能无法看到它是pure function

当然,C标准并不能保证这种优化。但是,随着您在编程方面的丰富经验,您对编译器和其他工具的了解会越来越多,并且您将熟悉优秀工具的期望,并且您还将学会提防上述问题。对于简单表达式,您可以期望编译器进行优化。但是您需要对可能干扰优化的事情保持警惕。

以上是关于c是否优化了for循环的检查部分?的主要内容,如果未能解决你的问题,请参考以下文章

将C语言循环部分优化,改成线性汇编或者C的都行!~~高手求救

我可以优化具有 3 个 for 循环和 4 个 if 的代码吗?

如何优化C ++代码的以下片段 - 卷中的零交叉

如何检查文件是否不存在,并使用For循环显示一个整体响应

针对IF语句测试范围值数组的最佳方法

使用 for 循环和过滤器优化代码