aşağıdaki C# fonksiyonu:Ekstra ldnull ve kuyruğun amacı nedir. F # uygulamasında vs C#?
IL_0000: ldarg.1
IL_0001: callvirt 05 00 00 0A
IL_0006: ret
Ama eşdeğer F # işlevi:
let resultOfFunc func = func()
Buna derler:
T ResultOfFunc<T>(Func<T> f)
{
return f();
}
Buna şaşırtıcı olmayan derler
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldnull
IL_0003: tail.
IL_0005: callvirt 04 00 00 0A
IL_000A: ret
(Her ikisi de serbest bırakma modunda). Başlangıçta fazla merak etmediğim fazladan bir nop var, ama ilginç olan şey ek ldnull
ve tail.
yönergeleri. (Muhtemelen yanlış)
Benim tahminim ldnull
fonksiyonu bu yüzden hala bir şey (unit
) döndürür void
olması durumunda gereklidir, ama bu tail.
eğitimin amacı ne olduğunu açıklamak olmamasıdır. Ve eğer fonksiyon yığın üzerinde bir şey itiyorsa ne olur, atılmayan ekstra bir null ile sıkışıp kalmaz mı?
Bu durumda fonksiyonun bir kuyruk çağrısına dönüştürüldüğünden şüpheleniyorum - yeni işlev eski bir yığının yığılma alanını kullanacak –
Bunun bir performans sıkıntısına neden olacağını unutmayın, bu soruya bakın: [Performans Generic.List .Add bir fonksiyondaki son ifadedir ve tailcall optimizasyonu açıksa] (http://stackoverflow.com/q/28649422/636019) –
ildjarn