在无分支POV中逻辑和&很好地替代了if语句

问题描述

所以,我有时看到这样的代码

some_conditions && something();

用于代替

if(some_conditions) something();

现在,我想知道以下哪个版本最有效/更适合使用:

std::vector<int> v{};
v.size() < 10 && (v.push_back(2),1); // using the comma operator since push_back does not returns anything and so can't be evaluated to bool

std::vector<int> v{};
if(v.size() < 10) v.push_back(2);

解决方法

您拥有的代码段不是无分支的,因为它仍然基于第一次比较的结果执行条件逻辑。两者之间生成的代码通常是相同的。

任何值得精打细算的优化编译器都应产生相同的程序集。如果比较GCC on godbolt的输出,则两个表达式都产生相同的程序集(只是区别是分支名称),并且两种情况都产生分支。


通常,您应该着眼于编写可读性强的代码,而不用担心这两个代码中的哪一个“性能更好”。易于阅读和维护代码的价值更大。只有在确定(分析后)确定所编写的代码不是最优的并引起问题之后,才值得对代码进行优化。