gpt4 book ai didi

C++ : Can the compiler optimize this code segment?

转载 作者:可可西里 更新时间:2023-11-01 18:20:15 25 4
gpt4 key购买 nike

void foo(const int constant)
{
for(int i = 0; i < 1000000; i++) {
// do stuff
if(constant < 10) { // Condition is tested million times :(
// inner loop stuff
}
}
}

外循环的每次执行都会检查“constant”的值。然而,常量永远不会改变,所以大量的 CPU 时间被浪费在测试条件常量 < 10 上?一遍又一遍地。一个人会在前几次通过后意识到常数永远不会改变,并且聪明地避免一遍又一遍地检查它。编译器是否注意到这一点并对其进行智能优化,或者重复的 if 循环是否不可避免?

我个人认为这个问题是不可避免的。即使编译器将比较放在外循环之前并设置某种 bool 变量“skip_inner_stuff”,仍然必须在外循环的每次传递中检查该变量。

您对此事有何看法?是否有更有效的方法来编写上述代码段来避免该问题?

最佳答案

您描述的优化也称为 loop unswitching .多年来,它一直是优化编译器的标准部分 - 但如果您想确保编译器执行它,请使用某种优化级别(例如 gcc 中的 -O2)编译您的示例代码并检查生成的代码。

但是,在编译器无法证明一段代码在整个循环中不变的情况下 - 例如对编译时不可用的外部函数的调用 - 实际上,手动将代码提升到循环之外可以带来非常大的性能提升。

关于C++ : Can the compiler optimize this code segment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18681363/

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