C++ C++;if语句重新排序
编译器会这样优化它吗:C++ C++;if语句重新排序,c++,gcc,optimization,if-statement,C++,Gcc,Optimization,If Statement,编译器会这样优化它吗: bool prevCurve; bool curveInside; bool prevCurveIn if (!prevCurve || curveInside != prevCurveIn){ ... } 这完全取决于编译器和周围的代码,但考虑到最常见的指令集,这并不是一个优化 原因是您有三个操作要以任意一种方式执行: 一个求值,变量或否定变量 否定 或/及 顺序可能不同,但必须执行这些点。我不知道任何指令集,其中一个可以优化其他 如注释中所述,编译器甚至可以优化
bool prevCurve;
bool curveInside;
bool prevCurveIn
if (!prevCurve || curveInside != prevCurveIn){
...
}
这完全取决于编译器和周围的代码,但考虑到最常见的指令集,这并不是一个优化 原因是您有三个操作要以任意一种方式执行:
- 一个求值,变量或否定变量
- 否定
- 或/及
gcc -S main.cpp
这完全取决于编译器和周围的代码,但考虑到最常见的指令集,这并不是一个优化 原因是您有三个操作要以任意一种方式执行:
- 一个求值,变量或否定变量
- 否定
- 或/及
gcc -S main.cpp
否。计算此表达式时:
if (!(prevCurve && curveInside == prevCurveIn)){
该标准要求在评估表达式剩余部分之前,对prevCurve
进行全面评估,包括任何副作用。运算符“&&”引入一个序列点。在同等情况下:
if (!prevCurve || curveInside != prevCurveIn){
操作符|
还引入了序列点
从理论上讲,编译器可能在这两种情况下生成相同的代码,但即使生成了相同的代码,这也不是优化。撇开基于其他考虑因素的优化可能性不谈,每种情况下的代码都将执行一个具有完全相同结果的类似指令序列。本标准要求如此。否。在计算此表达式时:
if (!(prevCurve && curveInside == prevCurveIn)){
该标准要求在评估表达式剩余部分之前,对prevCurve
进行全面评估,包括任何副作用。运算符“&&”引入一个序列点。在同等情况下:
if (!prevCurve || curveInside != prevCurveIn){
操作符|
还引入了序列点
从理论上讲,编译器可能在这两种情况下生成相同的代码,但即使生成了相同的代码,这也不是优化。撇开基于其他考虑因素的优化可能性不谈,每种情况下的代码都将执行一个具有完全相同结果的类似指令序列。标准要求是这样的。为什么是优化?这取决于编译器、优化设置以及布尔值的获取位置和时间(即,如果其中一个值在当前范围内为常量,它可能会从等式中完全消失)@LaszloPapp:在第一种情况下,必须检查比较的两个部分,在“优化”行中,理想情况下只有一个。@Jongware:你是什么意思?在第二个示例中,如果
prevCurve
为false
,则第二部分不需要检查。为什么会是优化?这取决于编译器和优化设置,以及布尔值的获取位置和时间(即,如果其中一个值在您当前的范围内是常数,它可能会从方程中完全消失)。@LaszloPapp:在第一种情况下,必须检查比较的两个部分,在“优化”行中,理想情况下只有一个。@Jongware:你是什么意思?在第二个例子中,如果prevCurve
为false
,则第二部分不需要检查。为了澄清,标准要求在这两种情况下执行if
后面的语句块,或在两种情况下均未执行;它不要求生成什么汇编代码,也不要求运行多长时间。@MattMcNabb:但它对求值顺序以及是否对右侧的|
和&
求值都有要求。是的,尽管在这个特定的例子中,这种评估没有明显的效果(除非变量是易变的或未初始化的)。我的意思是说,该标准不要求生成类似的指令序列,即使保证这两个表达式具有完全相同的可观察行为,为了澄清,该标准要求如果在这两种情况下执行或不在这两种情况下执行,则后面的语句块;它不要求生成什么汇编代码,也不要求运行多长时间。@MattMcNabb:但它对求值顺序以及是否对右侧的|
和&
求值都有要求。是的,尽管在这个特定的例子中,这种评估没有明显的效果(除非变量是易变的或未初始化的)。我的意思是,标准不要求生成类似的指令序列,即使这两个表达式保证具有完全相同的可观察行为