2009-04-04 14 views
9

Yığın en üstteki öğeye erişmek için Reflection.Emit'u kullanarak .NET'te bir yol var mı? Yani A en üstte ve sonra B ise - sonra A sonra işlemek istiyorum. Bu A B çoğaltmak için iyi olurdu (çünkü ben bunu elde ettiğimde ikinci B sadece "pop" olabilir).Reflection.Emit - yığından en üstteki ancak bir öğeye erişim

Şu anda, yerel ilan ediyorum:

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 

açık yerel ihtiyacı olmayan bir yol var mı?

cevap

7

Sanırım öyle değil. IL'de, istediğiniz şeyi yapmanıza izin veren takas gibi talimatlar yoktur. Neden yerel olarak sakıncalı olarak kullanıyorsunuz? JIT derleyicisi yeterince iyi ise, bu, IL'deki varsayımsal bir takas işleminden daha yavaş bir makine koduna neden olmaz.

+1

"Neden" için - bu, istediğim daha fazla yereli tanıtmak zorunda olacak şekilde oluşturulmuş koddur. Yığının en üstünü kullanabilseydim, önemsiz miktarlarda yığın alanı biriktirebilirim (yerliler, kullanımdan bağımsız olarak ayrılırlar, AFAIK). –

1

Inline, bazı sıralama yapmak için küçük bir işlev deneyebilirsin. Daha hızlı olacağından emin değilim.

+0

İyi düşünce, ama neredeyse kesinlikle değil; JUT belirtmiş olsa bile. –

1

Aynı sorunla karşılaştım. Oldukça büyük bir yöntem oluşturmak istedim ve hesaplanmış bir değeri depolamak için sıklıkla 'takas' yapmak istedim. Ildasm'da ortaya çıkan yerel halkın büyük bir kısmından memnun değildim ve BeginScope/EndScope'un herhangi bir yardım almadığını fark ettim. Yöntemimin bağlamı için yerel bir 'takas' oluşturup her takas işlemi için yeniden kullanıyorum. Üretilen IL temizleyiciyi yapar; Performans üzerinde anlamlı bir etkisi olup olmadığından emin değil.

İlgili konular