在我的C ++中(假设这是gcc)我执行以下操作:
bool prevCurve;
bool curveInside;
bool prevCurveIn
if (!(prevCurve && curveInside == prevCurveIn)){
...
}
编译器会像那样优化它:
bool prevCurve;
bool curveInside;
bool prevCurveIn
if (!prevCurve || curveInside != prevCurveIn){
...
}
答案 0 :(得分:2)
这完全取决于你的编译器和代码,但考虑到那里最常见的指令集,这不是一个优化。
原因是您有三种操作可以执行:
订单可能不同,但必须执行这些要点。我不知道任何可以优化另一个的指令集。
正如评论中所写,编译器甚至可以优化变量,如果它们具有常量值,您使用gcc的哪些优化选项,哪个版本的gcc,哪种架构,不同的平台等等。
最好的方法是比较您可以生成的汇编器输出:
gcc -S main.cpp
答案 1 :(得分:2)
没有。评估此表达式时:
if (!(prevCurve && curveInside == prevCurveIn)){
该标准要求在评估表达式的其余部分之前对prevCurve
进行全面评估,包括任何副作用。运营商'&&'介绍一个序列点。在等效的情况下:
if (!prevCurve || curveInside != prevCurveIn){
运算符||
也引入了序列点。
理论上,编译器可能在这两种情况下生成相同的代码,但即使这样做也不是优化。撇开基于其他考虑因素的优化的可能性,每种情况下的代码将执行具有完全相同结果的类似指令序列。标准要求如此。