【发布时间】:2018-02-28 20:33:13
【问题描述】:
使用下面的代码,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()
}
什么会被优化?
【问题讨论】:
-
这取决于编译器和标志。可能会被优化,也可能不会。
-
这取决于特定的编译器。但是传统的很可能会对此进行优化。
-
试试godbolt.org。它向您展示了各种编译器生成的程序集。
-
我不会依赖它来优化。一方面有很多因素会影响它,而且很容易强制编译器在另一方面只调用一次。
-
@EugeneSh。使用像 gcc 这样的优秀编译器进行优化非常棒,但假设您正在为 MCU 编码,芯片制造商提供的一些交叉编译器充其量只是不稳定。尽管对 SO 的普遍看法是编译器比我好,但我被教导不要编写懒惰的代码,也不要让编译器为我完成工作。如果循环条件显然可以在循环之前完成,那就不费吹灰之力了。
标签: c++ c optimization