我有一个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,否则如果为false,则c递增d。
我可以这样做,使用布尔结果来查找数组索引吗?
答案 0 :(得分:9)
当然你可以做到。但是,你可能只会让情况变得更糟。如果你认为你在这种情况下删除分支 - 你错了。假设一个生产质量编译器和x86_64架构,你的第一个版本将产生一个很好的条件移动(即cmovge
)。但是,第二个版本将导致额外的间接和读取内存级别(即mov eax,DWORD PTR [rax*4+0x4005d0]
。
如果你接受建议,我现在感觉你正走在一条非常非常错误的道路上。在优化计划时,您必须先衡量/配置文件以确定瓶颈。只有当您知道什么是瓶颈时,才能开始优化它们。优化时,您必须再次衡量/分析以查看是否有改进。你似乎在做的是不信任你的编译器,猜测和做错误优化。我建议你就在那里停下来,否则它会从那里下山,相信我。
答案 1 :(得分:3)
如果您想要更紧凑的代码,可以用以下内容替换if语句。
c += (x < y) ? d : f;
答案 2 :(得分:2)
是的,这将有效。虽然它会使你的代码更难理解,现代编译器仍会消除if语句(转换为汇编程序时)。