在无分支 POV 中逻辑 && 是 if 语句的良好替代

Alb*_*lia 0 c++ branch

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

some_conditions && something();
Run Code Online (Sandbox Code Playgroud)

代替

if(some_conditions) something();
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

或者

std::vector<int> v{};
if(v.size() < 10) v.push_back(2);
Run Code Online (Sandbox Code Playgroud)

Hum*_*ler 6

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

任何称职的优化编译器都应该生成相同的程序集。如果您比较godbolt上 GCC 的输出,两个表达式都会生成相同的程序集(唯一的区别是分支名称),并且两种情况都生成分支。


通常,您应该致力于编写可读的代码,而不必担心两者中的哪一个“对性能更好”。让您的代码易于阅读和维护更有价值。只有在您确定(在分析之后)您编写的代码是次优的并且会导致问题时,才值得优化代码。