循环/作用域中的c++条件优化
c++ condition optimization in a loop/scope
例如,如果我必须检查两个(或多个)条件中的一个才能在循环中执行作用域的其余部分,那么这些代码中哪一个是最好的?
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()
。这是两个有保证的分支!所以第一种选择更好。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有太多条件句的情况下,我如何避免被零除
- 基于多个条件处理地图中的所有元素
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 将按位if条件转换为普通if条件
- 条件断点在不应该触发时触发
- 为什么简单的算术减法在"if"条件下不起作用?
- 如何在for循环中包含两个索引值的测试条件
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 我提出什么条件才能再加5%的折扣
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 没有超时的C++条件变量
- 正在LLVM中检测整数比较条件
- 在条件变量中触发错误信号的频率是多少