2012-10-01 14 views
5

Her yerde JIT inlining'in nasıl olabileceğini anlamak isterim. JIT, kodumu bazı .NET yürütme zamanı derleme koduna satır içi olarak yazabilir mi?

benim kodda System.IO montaj diyelim bazı işlevi çağırmak ve bu System.IO işlevi içinde çağrılan benim kodda uygulandığı bir işleve bir geri arama referansı geçmesi varsayalım. Benim görevimde GetCallingAssembly() çağrı var. Yani benim geri dönüşüme System.IO GetCallingAssembly() çağrı özgün olarak benim kod içinde olduğunu ve "geçerli" yönteminin iç den denir amaçlandıysa System.IO şimdi benim kodun içinden çağrılır olduğunu söyleyecektir.

Böyle bir satır içi mümkünse veya .NET çalışma zamanı derlemeleri farklı bir şekilde işlenir mi, böylece kullanıcı kodunun .NET çalışma zamanı koduna JIT satırında girilmesine izin verilmez?

+1

Bir temsilci geri çağrısı, geri çağrı yapan kişiye hiç nasıl karşılık vermez? Bunun mantıklı olduğundan emin değilim ... Anladığım kadarıyla, inlining, çağrılacak kodun ** kanıtlanabilir ** - statik bir çağrı veya sanal olmayan bir yönteme sanal çağrı olduğu senaryolarla sınırlıdır. –

+0

@Mark Gravel: Tüm programda geri arama girişçisinin tek çağrısı olduğunu bilsem, neden olmasın? – sharptooth

+0

I * şüpheli * bu, JIT'den çok daha fazla çaba sarfedeceğinden, özellikle yansıma/meta programlama mevcut olduğundan (yani: yeni arayanlar sonradan var olabilir) –

cevap

3

Geri aranmanın satır içi olmayacağından emin olabilirsiniz. .NET Framework derlemeleri her zaman yükleme zamanında ngen.exe tarafından önceden jumper edilir, daha sonra bu kodu değiştirme seçeneği yoktur. Ayrıca, temsilci aracılığıyla yapılan geri bildirimler, jitter iyileştiricisi, temsilci hedef yönteminin ne olabileceğini anlasa bile, hiçbir zaman yönlendirilmez.