gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:27 25 4
gpt4 key购买 nike

使用下面的代码,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++ - c 是否优化了 for 循环的检查部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49038057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com