【发布时间】:2017-01-06 15:12:30
【问题描述】:
今天我开始使用检查两个布尔值的分支。我很确定在某些优化级别上它们只会被添加然后检查,但 gcc 和 clang 不是这种情况。为什么 gcc 不通过用加法和一个检查替换它们来优化两个布尔检查?让我给你看一个例子:
void test(bool a, bool b)
{
// Branch 1
if (a && b)
{
std::cout << "Branch 1";
}
// Branch 2
if (static_cast<int>(a) + static_cast<int>(b))
{
std::cout << "Branch 2";
}
}
gcc(即使优化级别最高)为分支 1 生成以下代码:
test dil,dil
je 400794 <test(bool, bool)+0x14>
test sil,sil
jne 4007b0 <test(bool, bool)+0x30>
它为分支 2 生成以下代码:
movzx ebx,bl
movzx ebp,bpl
add ebx,ebp
jne 4007cf <test(bool, bool)+0x4f>
两个分支(test + je)不应该比加法和分支(add + jne)慢吗?
编辑:我真正的意思是乘法,因为在真假 (1 + 0) 的情况下,加法得到真 (1),但乘法得到正确的结果 (0)。
【问题讨论】:
-
对于初学者来说,加法不是
&&,而是||。此外,虽然不确定当前的 C++ 标准,但对于false的表示曾经是0,而对于true则表示其他所有内容。因此,您可以将-1和+1用于两个真值,并且将它们相加并不是很好。同样,您可以拥有1和2和按位and对这些人不利。 -
@Jester: C++
bool变量只能是true或false(我认为对于 Cbool值也是如此。)转换时到int,它们必须分别转换为1或0。 -
加法与布尔和的行为不同。乘法就是你要找的。span>
-
可能与this case有关; GCC 的优化效率不如
bool值。 -
你不想要乘法,@user。那会慢一些。简单的按位与有什么问题? (没什么。没什么问题。如果你想强制优化,你应该使用它。)
标签: c++ gcc assembly optimization x86