循环/作用域中的c++条件优化

c++ condition optimization in a loop/scope

本文关键字:c++ 条件 优化 作用域 循环      更新时间:2023-10-16

例如,如果我必须检查两个(或多个)条件中的一个才能在循环中执行作用域的其余部分,那么这些代码中哪一个是最好的?

while(condition){
if(some_condition_1 || some_condition_2){
continue;
}
// ... do stuff
}

在这种情况下,如果我们知道some_condition_1与some_condition _2相比更经常为真,那么像下面这样分离条件是否有助于优化代码?

while(condition){
if(some_condition_1){
continue;
}
if(some_condition_2){
continue;
}

// do stuff
}

由于如果some_condition_1为真,那么在第二种情况下就不必检查some_condition _2

编写最容易阅读的内容,并进行优化编译。

话虽如此,在这种情况下,短路评估意味着你的第一个选择绝对更好。让我们看看原因:

假设编译器非常愚蠢(没有优化)。(我已经删除了你的continue,因为它们也会导致分支,但想法是一样的。)

while(condition){
if(some_condition_1 || some_condition_2){
do_stuff();
}
do_different_stuff();
}

这将必须生成1条分支指令:在if语句中,根据比较的值,指令指针可能会跳过包含do_stuff()continue的块,跳到紧接其后的点(在本例中为do_different_stuff())。根据架构、优化和代码的详细信息,可能会为some_condition_1 || some_condition_2的短路行为生成一个额外的分支。

这个版本怎么样?

while(condition){
if(some_condition_1){
do_stuff();
continue;
}
if(some_condition_2){
do_stuff();
continue;
}
do_different_stuff();
}

首先,我们将进入if(some_condition1),程序将"分支"——有条件地跳到if(some_condition2)。在这里,程序将再次分支,有条件地跳到do_different_stuff()。这是两个有保证的分支!所以第一种选择更好。