3

我有一个 C++ IF 语句,它看起来像(伪代码 - 所有变量都是整数):

if(x < y){
    c += d;
}
else{
    c += f;
}

我正在考虑尝试删除 IF 语句,而是将值 d 和 f 加载到一个二元素数组中:

array[0] = d
array[1] = f

然后我希望能够根据布尔的基础类型(至少在 C-0 或 1 中)引用数组元素“0”或“1”。有没有办法做到这一点?所以我的代码会变成这样:

c += array[(x<y)] 如果为真,c 增加 f,否则如果为假,c 增加 d。

我可以这样做吗,使用布尔结果来查找数组索引?

4

3 回答 3

11

当然你可以做到。但是,您可能只会使情况变得更糟。如果你认为在这种情况下你正在删除一个分支——你就错了。假设一个生产质量的编译器和 x86_64 架构,你的第一个版本将导致一个很好的条件移动(即cmovge)。然而,第二个版本将导致额外级别的间接和读取内存(即mov eax,DWORD PTR [rax*4+0x4005d0].

如果您接受建议,我有一种非常不好的感觉,您现在正走在一条非常非常错误的道路上。当您优化程序时,您必须首先测量/分析以确定瓶颈。只有当你知道什么是瓶颈时,你才能开始优化它们。优化时,您必须再次对其进行测量/分析以查看是否有改进。您似乎在做的是不信任您的编译器、猜测和进行错误优化。我建议你在那儿停下来,否则它会从那里下山,相信我。

于 2013-02-20T21:39:03.083 回答
4

如果您想要更紧凑的代码,可以将 if 语句替换为以下内容。

c += (x < y) ? d : f;
于 2013-02-20T21:32:02.197 回答
3

是的,这会奏效。尽管它会使您的代码更难理解,并且现代编译器无论如何都会消除 if 语句(在转换为汇编程序时)。

于 2013-02-20T21:30:31.797 回答