2009-07-08 184 views

回答

4

假設沒有COM組件,P/Invoke等安全代碼,應該沒有語義差異,但性能可能會受到影響。考慮:64位內存更多,但引用更大。贏得一些,輸掉一些。

無論如何,這裏有一些有用的參考資料:

「[...]考慮一個.NET應用程序 是100%安全的代碼在這種情況下 有可能採取您在 運行 .NET可執行文件。 32位機器並將其移動到 64位系統,並使其成功運行 爲什麼它可行? 由於程序集是100%類型安全的 我們知道在本機代碼或COM對象上沒有依賴項 並且 沒有'不安全'的代碼,這意味着 該應用程序在CLR的控制下完全運行 。在CLR 保證,而作爲 剛剛在時間(JIT)編譯的結果所產生的二進制代碼 將32位和64位之間 不同, 執行該代碼都將是 語義一樣。 [...]」

+1

理論上的應用將會運行相同,實際上在實現方面存在差異,32位和64位框架之間也存在不同的錯誤,這種情況並不常見,但確實發生了。在過去的2個月中,我遇到過至少3種情況,其中相同的MSIL在定位x86時的行爲與在x64系統上定位AnyCPU時的行爲不同。 – 2009-07-21 03:38:15

6

如果應用程序的目標是AnyCPU,則運行時行爲將會有所不同,特別是內存使用情況和限制。

在64位上,不會有相同的32位內存限制(理論上2GB最大內存,實際上是1.2-1.6)。但是,所有的對象引用都是兩倍,所以64位系統會使用更多的內存。

此外,64位系統通常有額外的寄存器等,所以有時性能可能會略有提高。不過,這是特定於平臺的。

如果應用程序的目標是x86,它將在WoW64下運行,並且與它在32位系統中的行爲方式幾乎完全相同。

4

除了那些由Reed Copsey識別的方法之外,另一種方式可能是如果你的「純粹」應用程序碰巧使用了System.IntPtr結構體,或者它使用了不安全的代碼(這不是一回事作爲P/Invoke)和指針算術。

另一個值得關注的重點是召喚幾乎所有System.Runtime.InteropServices.Marshal類的東西。有各種各樣的令人敬畏的方式在那裏拍攝自己的腳(當然,當你需要它時非常有用)。

+0

良好補充 – 2009-07-08 00:44:16

相關問題