Derleyici gezgini ile oynuyordum ve bu 2 fonksiyonun hem gcc hem de clang'da farklı montajlar oluşturduğunu keşfettim. Çizgiyi çizdikten sonra aynı ifade ağaçlarını ve dolayısıyla aynı ve en uygun montajı üretmelerini bekledim.Bu, optimizasyonların bir tuhaflığı mıdır, yoksa optimizasyonları yasaklayan dil kuralları mıdır?
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 sonuç
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 C++ 1z -O3 sonuç
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
Yani = olup -std Bu optimizasyonların bir tuhaflığı mı yoksa optimizasyonları yasaklayan dil kuralları mı?
Muhtemelen, OR'd karşılaştırmalarını bir çıkarma + toplama ile birleştiren geçiş, geçiş geçişinden önce gerçekleşti. –
[The gcc 7.0 anlık görüntüsü bunları aynı koda göre optimize eder] (https://godbolt.org/g/iPXtEi). Bence T.C. doğru. – Cornstalks