Tôi đã chơi với trình thám hiểm trình biên dịch và thấy rằng 2 chức năng này tạo ra sự lắp ráp khác nhau trong cả gcc và clang. Tôi hy vọng rằng sau khi inlining họ sẽ sản xuất cây biểu hiện giống hệt nhau và do đó lắp ráp giống hệt nhau và tối ưu.Đây có phải là một sự lừa đảo của trình tối ưu hóa hoặc kết quả của các quy tắc ngôn ngữ cấm tối ưu hóa không?
constexpr bool is_nonzero_decimal_digit(char const c) noexcept
{
return c == '1' || c == '2' || c == '3' || c == '4' || c == '5'
|| c == '6' || c == '7' || c == '8' || c == '9';
}
bool is_decimal_digit_v1(char const c) noexcept
{
return c == '0' || is_nonzero_decimal_digit(c);
}
bool is_decimal_digit_v2(char const c) noexcept
{
return c == '0' || c == '1' || c == '2' || c == '3' || c == '4'
|| c == '5' || c == '6' || c == '7' || c == '8' || c == '9';
}
Clang 3.9.1 -std = C++ 1Z-O3 kết quả
is_decimal_digit_v1(char):
cmp dil, 48
sete cl
add dil, -49
cmp dil, 9
setb al
or al, cl
ret
is_decimal_digit_v2(char):
add dil, -48
cmp dil, 10
setb al
ret
gcc 6.3 -std = C++ 1Z-O3 kết quả
is_decimal_digit_v1(char):
cmp dil, 48
je .L3
sub edi, 49
cmp dil, 8
setbe al
ret
.L3:
mov eax, 1
ret
is_decimal_digit_v2(char):
sub edi, 48
cmp dil, 9
setbe al
ret
Vì vậy, là điều này là một sự lừa đảo của trình tối ưu hóa hoặc kết quả của các quy tắc ngôn ngữ cấm tối ưu hóa?
Có lẽ, đường chuyền hợp nhất các phép so sánh HOẶC thành một phép trừ + so sánh chạy trước đường gạch chân nội tuyến. –
[Ảnh chụp nhanh gcc 7.0 tối ưu hóa chúng thành cùng một mã] (https://godbolt.org/g/iPXtEi). Tôi nghĩ T.C. đúng. – Cornstalks