Gibt es einen schnelleren Weg als x >= start && x <= end
in C oder C++, um zu testen, ob eine Ganzzahl zwischen zwei Ganzzahlen liegt?
UPDATE: Mein spezifisches Betriebssystem ist iOS. Dies ist Teil einer Feldunschärfe-Funktion, die Pixel auf einen Kreis in einem gegebenen Quadrat beschränkt.
UPDATE: Nachdem ich die akzeptierte Antwort ausprobiert habe, erzielte ich eine Geschwindigkeitssteigerung um eine Größenordnung bei einer Codezeile gegenüber der normalen Art des Testens x >= start && x <= end
.
UPDATE: Hier ist der Code nach und vorher mit Assembler aus XCode:
NEUER WEG
// diff = (end - start) + 1
#define POINT_IN_RANGE_AND_INCREMENT(p, range) ((p++ - range.start) < range.diff)
Ltmp1313:
ldr r0, [sp, #176] @ 4-Byte-Neuladen
ldr r1, [sp, #164] @ 4-Byte-Neuladen
ldr r0, [r0]
ldr r1, [r1]
sub.w r0, r9, r0
cmp r0, r1
blo LBB44_30
ALTER WEG
#define POINT_IN_RANGE_AND_INCREMENT(p, range) (p <= range.end && p++ >= range.start)
Ltmp1301:
ldr r1, [sp, #172] @ 4-Byte-Neuladen
ldr r1, [r1]
cmp r0, r1
bls LBB44_32
mov r6, r0
b LBB44_33
LBB44_32:
ldr r1, [sp, #188] @ 4-Byte-Neuladen
adds r6, r0, #1
Ltmp1302:
ldr r1, [r1]
cmp r0, r1
bhs LBB44_36
Ziemlich erstaunlich, wie eine Reduzierung oder Eliminierung von Verzweigungen eine so dramatische Geschwindigkeitssteigerung bewirken kann.