私はコンパイラエクスプローラで遊んでいましたが、これらの2つの関数がgccとclangの両方で異なるアセンブリを生成することがわかりました。私は、インライン化後、彼らは同一の発現樹を生成し、したがって同一で最適なアセンブリを生成すると予想した。これはオプティマイザのクルークですか、または最適化を禁じる言語ルールの結果ですか?
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';
}
クラン3.9.1 -std = C++ 1Z -03結果
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 -03結果
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
だから、=であり、-stdこれはオプティマイザの奇抜なこと、または最適化を禁じる言語規則の結果ですか?
おそらく、OR'd比較を1つの減算+比較にマージしたパスは、インライン化パスの前に実行されました。 –
[gcc 7.0スナップショットは、それらを同じコードに最適化します](https://godbolt.org/g/iPXtEi)。私はT.C.正しい。 – Cornstalks