9 Stimmen

Reflection.Emit - Zugriff auf das oberste Element des Stapels (außer einem)

Gibt es eine Möglichkeit in .NET, mit Reflection.Emit um auf das oberste Element des Stapels zuzugreifen, das aber ein Element ist? Wenn also A das oberste Element ist und B das nächste, möchte ich zuerst B und dann A verarbeiten. Es wäre in Ordnung, B zu duplizieren. über A (da ich das zweite B einfach "knacken" kann, wenn ich es erreiche).

Derzeit melde ich einen Ort an:

    LocalBuilder loc = il.DeclareLocal(typeof(Foo));
    il.Emit(OpCodes.Stloc, loc); // store and pop topmost stack item
    // work with (pop) previous stack item 
    il.Emit(OpCodes.Ldloc, loc); // push old topmost stack item

Gibt es eine Route, die keine explizite Ortsangabe benötigt?

7voto

kvb Punkte 54045

Nein, das glaube ich nicht. In IL gibt es keine Anweisungen wie Swap, die es Ihnen erlauben würden, das zu tun, was Sie wollen. Warum sehen Sie die Verwendung eines Local als verwerflich an? Wenn der JIT-Compiler gut genug ist, wird dies nicht zu einem langsameren Maschinencode führen als die Verwendung einer hypothetischen Swap-Operation in IL.

1voto

Sam Saffron Punkte 124121

+1 für die Antwort der kvbs, siehe: http://www.codeproject.com/KB/msil/msilenhancement.aspx

1voto

leppie Punkte 111830

Inline mit, was kvb sagte, könnten Sie versuchen, eine kleine Funktion, um einige Neuordnung zu tun. Nicht sicher, ob es schneller wäre.

1voto

Dan Bryant Punkte 27022

Ich bin auf das gleiche Problem gestoßen. Ich wollte eine ziemlich große Methode erstellen und wollte oft "swappen", um einen berechneten Wert zu speichern. Ich war unzufrieden mit der großen Anzahl lokaler Werte, die in ildasm angezeigt wurden, und bemerkte, dass BeginScope/EndScope keine Hilfe waren. Schließlich erstellte ich einen lokalen "Swap" für den Kontext meiner Methode und verwendete ihn für jede Swap-Operation wieder. Es macht die generierte IL sauberer; nicht sicher, ob es eine sinnvolle Auswirkung auf die Leistung hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X