Sau đây C# chức năng:Mục đích của ldnull và đuôi thêm là gì. trong F # thực hiện vs C#?
T ResultOfFunc<T>(Func<T> f)
{
return f();
}
biên dịch gì ngạc nhiên như thế này:
IL_0000: ldarg.1
IL_0001: callvirt 05 00 00 0A
IL_0006: ret
Nhưng tương đương với F # Chức năng:
let resultOfFunc func = func()
biên dịch như sau:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldnull
IL_0003: tail.
IL_0005: callvirt 04 00 00 0A
IL_000A: ret
(Cả hai đều ở chế độ phát hành). Có một nop thêm lúc đầu mà tôi không quá tò mò về, nhưng điều thú vị là thêm ldnull
và tail.
hướng dẫn.
tôi đoán (có thể sai) là ldnull
là cần thiết trong trường hợp hàm là void
vì vậy nó vẫn trả về một cái gì đó (unit
), nhưng điều đó không giải thích mục đích của hướng dẫn tail.
là gì. Và điều gì sẽ xảy ra nếu chức năng đẩy thứ gì đó lên ngăn xếp, không phải là nó bị mắc kẹt với một giá trị rỗng không bị xuất hiện?
Tôi nghi ngờ rằng trong trường hợp này hàm đã được hội tụ thành một cuộc gọi đuôi - chức năng mới sẽ sử dụng không gian ngăn xếp cũ –
Lưu ý rằng điều này có khả năng gây ra bi quan hiệu suất, xem câu hỏi này: phạt khi Generic.List .Thêm là câu lệnh cuối cùng trong một chức năng và tối ưu hóa tailcall được bật] (http://stackoverflow.com/q/28649422/636019) –
ildjarn