C++ 为什么在比较某个数字是否在范围内时会在汇编代码中发生分支?

C++ 为什么在比较某个数字是否在范围内时会在汇编代码中发生分支?,c++,c,performance,math,optimization,C++,C,Performance,Math,Optimization,我在读这个问题,它的答案是可以接受的。我阅读了评论,但我无法找出产生优化的原因 为什么在使用以下代码时会在汇编代码中发生分支 x >= start && x <= end x>=start&&x注意,链接的问题有一个根本不同的表达式 x >= start && x++ <= end 请注意,第二个表达式p++>=range.start有副作用。即,通过1对p进行(后)递增。但只有当p=range.startifp Short时,才能观察

我在读这个问题,它的答案是可以接受的。我阅读了评论,但我无法找出产生优化的原因

为什么在使用以下代码时会在汇编代码中发生分支

x >= start && x <= end

x>=start&&x注意,链接的问题有一个根本不同的表达式

x >= start && x++ <= end

请注意,第二个表达式
p++>=range.start
有副作用。即,通过
1
p
进行(后)递增。但只有当
p=range.start
if
p Short时,才能观察到这种副作用Circuiting@Mysticial我不知道这在这方面意味着什么。我在评论中读到了这一点,但无法理解。这就是我开始问这个问题的原因。@Mystical:但短路在这里没有区别,因为没有明显的副作用。编译器将有权通过一个分支实现此功能。@OliCharlesworth这就是为什么我没有给出答案,因为我也不是100%确定。@Jason我想问一下在所述过程中产生优化的原因。产生分支的原因是什么?@Enigma:如果第二个条件很难评估,那么短路可能会导致性能显著下降。这就是为什么我很惊讶编译器没有将其简化为一个分支(在链接问题中)。@Oli Charlesworth:我不这么认为。看看原来的帖子。上下文是宏(?)
范围内的点和增量(p,RANGE)
的定义,以及当宏定义为
p=RANGE时编译器发出分支的原因。start
@Jason:在OP的代码中,没有副作用,因此短路是无关的。在链接问题的代码中,有一个副作用(正如您正确指出的那样),它确实会产生不同的效果。@Zel这两个问题在什么样的优化是可能的方面是完全不同的。在后面的部分中,链接问题有一个副作用,这意味着编译器必须为正确性进行短路。如果没有副作用,不短路会导致更好的性能。当副作用存在或不存在时,“可能”和“必须”之间有区别。如果没有副作用,编译器可以随心所欲地重新排列(为了速度),但是如果有副作用,并且存在副作用,编译器就不能重新排列。在答案中包含这一点可能会有所帮助。
define POINT_IN_RANGE_AND_INCREMENT(p, range) 
    (p <= range.end && p++ >= range.start)
Ltmp1301:
 ldr    r1, [sp, #172] @ 4-byte Reload
 ldr    r1, [r1]
 cmp    r0, r1
 bls    LBB44_32
 mov    r6, r0         @ if the result of the compare is false 
 b      LBB44_33       @ branch over evaluating the second expression
                       @ to avoid the side effects of p++
LBB44_32:
 ldr    r1, [sp, #188] @ 4-byte Reload
 adds   r6, r0, #1
Ltmp1302:
 ldr    r1, [r1]
 cmp    r0, r1
 bhs    LBB44_36