有在CIL一些裝載指令,如ldc.i4.0
,ldc.i4.1
,ldc.i4.2
,ldc.i4.3
...ldc.i4.x和ldc.i4 x指令是否可互換且語義相同?
我在想,是不是可以使用ldc.i4 1
,而不是ldc.i4.1
或ldc.i4 5
,而不是ldc.i4.5
?
有在CIL一些裝載指令,如ldc.i4.0
,ldc.i4.1
,ldc.i4.2
,ldc.i4.3
...ldc.i4.x和ldc.i4 x指令是否可互換且語義相同?
我在想,是不是可以使用ldc.i4 1
,而不是ldc.i4.1
或ldc.i4 5
,而不是ldc.i4.5
?
是的,這是完全合法的,到位的ldc.i4.1
使用ldc.i4 1
。在最常見的情況下,單字節操作碼的效率和簡潔度分別爲和。特別是,所有ldarg.0
(1字節)將快速加起來爲顯着增加您的程序集的大小,如果他們是ldarg 0
(3個字節),ldc.i4.1
像i++
; ldc.i4 1
是5字節而不是1.
您沒有義務使用它們。我實際上期望(未經測試)的JIT發現更詳細的用法和對待它無論如何,雖然它不會要求這樣做。
就個人而言,當我在做「發射」或類似的,我只是使用發出對於任何給定值的最合適代碼(一個或多個)/本地/參數/等
這是關於CLR代碼注入的好文章: http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time
是否可以使用ldc.i4而不是ldc.i4.1或ldc.i4而不是ldc.i4.5? –
沒錯。問題是關於具體說明。一般來說,如果可能或者如何注射IL,則不是那麼重要。 – hometoast
不確定一個實用方法。 。 但爲什麼?他們需要更多的空間,似乎沒有任何好處。 – harold
這是一個關於代碼注入的問題嗎?在這種情況下,大概答案是否定的,不容易,因爲他們需要更多的空間?可能值得澄清這裏的背景,以及'替換'的含義。 –
@詹姆斯確實,那裏的問題還不清楚;我選擇將它解釋爲「這兩件事是可以互換的,而且語義上相同嗎?」 –