Có cách nào nhanh hơn x >= start && x <= end
trong C hoặc C ++ để kiểm tra xem một số nguyên nằm giữa hai số nguyên không?
CẬP NHẬT : Nền tảng cụ thể của tôi là iOS. Đây là một phần của chức năng làm mờ hộp hạn chế pixel vào một vòng tròn trong một hình vuông nhất định.
CẬP NHẬT : Sau khi thử câu trả lời được chấp nhận , tôi nhận được một lệnh tăng tốc độ lớn trên một dòng mã so với thực hiện x >= start && x <= end
theo cách thông thường .
CẬP NHẬT : Đây là mã sau và trước với trình biên dịch mã từ XCode:
CÁCH MỚI
// diff = (end - start) + 1
#define POINT_IN_RANGE_AND_INCREMENT(p, range) ((p++ - range.start) < range.diff)
Ltmp1313:
ldr r0, [sp, #176] @ 4-byte Reload
ldr r1, [sp, #164] @ 4-byte Reload
ldr r0, [r0]
ldr r1, [r1]
sub.w r0, r9, r0
cmp r0, r1
blo LBB44_30
CÁCH CŨ
#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
b LBB44_33
LBB44_32:
ldr r1, [sp, #188] @ 4-byte Reload
adds r6, r0, #1
Ltmp1302:
ldr r1, [r1]
cmp r0, r1
bhs LBB44_36
Khá tuyệt vời làm thế nào giảm hoặc loại bỏ phân nhánh có thể cung cấp một tốc độ đáng kể như vậy.