Zastanawiam się, czy prosta funkcja statyczna wykorzystująca operator?: Jest wbudowana podczas kompilacji na czas. Oto dowolny przykład użycia kodu.Czy metody używają instrukcji?: Operator Inlined podczas kompilacji JIT?
public static int Max(int value, int max)
{
return value > max ? max : value;
}
co daje następujące IL:
Max:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: bgt.s IL_0008
IL_0005: ldarg.0
IL_0006: br.s IL_0009
IL_0008: ldarg.1
IL_0009: stloc.0
IL_000A: br.s IL_000C
IL_000C: ldloc.0
IL_000D: ret
A może być prostsza alternatywa inlined?
public static int Max(int value, int max)
{
if (value > max)
{
return max;
}
else
{
return value;
}
}
Oto IL dla niego:
Max:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: cgt
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: brfalse.s IL_000E
IL_0009: nop
IL_000A: ldarg.1
IL_000B: stloc.1
IL_000C: br.s IL_0013
IL_000E: nop
IL_000F: ldarg.0
IL_0010: stloc.1
IL_0011: br.s IL_0013
IL_0013: ldloc.1
IL_0014: ret
: operator widocznie generuje bardziej zwięzły MSIL niż gdyby alternatywa, ale czy ktoś wie co się dzieje podczas kompilacji JIT? Czy obaj są zainspirowani? Czy któryś z nich jest włączony?
„inline” to termin, który odnosi się do tego, co robi z optymalizator jitter metody * *. Operator?: Nie jest metodą, kod maszynowy zawsze jest generowany "w linii", nawet w niezoptymalizowanej wersji debugowania. –
Twoja metoda Max? Oczywiście, jest bardzo mały i nie robi nic złego, że optymalizator nie lubi. Musisz poprawić swój tytuł pytania. –
@Krythic Zgadzam się z Hansem, ty tytuł jest trochę mylący. Brzmi to tak, jakbyś pytał, czy sam operator '?:' Jest zainicjowany, a nie metody zawierające '?:' Są wstawione, co jest twoim prawdziwym pytaniem. –