Ich habe über die Intermediate Language for C # (IL) gelernt und stieß auf den folgenden Code: -
%Vor% Ich bin ein Anfänger im Verständnis von IL, aber ich kenne die Bedeutung dieser sehr grundlegenden Anweisungen, die im obigen Beispiel in Main
verwendet werden.
Meine Frage ist, besteht ein Unterschied zwischen der Anweisung ldc.i4.s
, die zum Laden von 50 verwendet wird, und der Anweisung ldc.i4
, die verwendet wird, um 30 auf den Auswertestapel zu laden.
Wie entscheidet der Compiler, welche Anweisung (aus diesen beiden) wann verwendet wird?
Der Unterschied besteht darin, dass ldc.i4.s
nur verwendet werden kann, wenn der Operand in ein vorzeichenbehaftetes Byte (-128 bis einschließlich 127) passen kann. Der Vorteil ist, dass die resultierende IL kürzer ist, was Platz im Programm spart. Dies ist hilfreich, da viele konstante Lasten kleine Konstanten verwenden.
Sie können ldc.i4 .s , wenn Ihr Wert zwischen -128 to 127
liegt.
ldc.i4.s ist eine effizientere Kodierung, um die ganzen Zahlen abzustoßen -128 bis 127 auf den Auswertungsstapel.
ldc.i4.s
Drücken Sie num des Typs int32 als int32 auf den Stack. Drücken Sie -1 des Typs int32 auf den Stack als int32 (Alias für ldc.i4.m1). Drücken Sie num auf den Stapel als int32, kurze Form. Drücken Sie num vom Typ int64 als int64 auf den Stack.
OpCode: 0x1F
Anweisung: ldc.i4.s
Beschreibung: Drücken Sie num auf den Stack als int32, kurze Form.
ldc.i4
Drücken Sie -1 als Int32 auf den Stack (Alias für ldc.i4.m1). Drücken Sie num auf den Stack als int32, kurze Form. Drücken Sie num des Typs int64 auf den Stapel als int64. Drücken Sie num des Typs float32 als F auf den Stapel.
OpCode: 0x20
Anweisung: ldc.i4
Beschreibung: Drücken Sie num des Typs int32 als int32 auf den Stack. Basisanweisung