想象一下,不使用COM組件或PInvoke的純.NET應用程序。如果目標系統是32位或64位,那麼這很重要嗎?.NET在32位或64位系統上有什麼區別?
回答
假設沒有COM組件,P/Invoke等安全代碼,應該沒有語義差異,但性能可能會受到影響。考慮:64位內存更多,但引用更大。贏得一些,輸掉一些。
無論如何,這裏有一些有用的參考資料:
「[...]考慮一個.NET應用程序 是100%安全的代碼在這種情況下 有可能採取您在 運行 .NET可執行文件。 32位機器並將其移動到 64位系統,並使其成功運行 爲什麼它可行? 由於程序集是100%類型安全的 我們知道在本機代碼或COM對象上沒有依賴項 並且 沒有'不安全'的代碼,這意味着 該應用程序在CLR的控制下完全運行 。在CLR 保證,而作爲 剛剛在時間(JIT)編譯的結果所產生的二進制代碼 將32位和64位之間 不同, 執行該代碼都將是 語義一樣。 [...]」
理論上的應用將會運行相同,實際上在實現方面存在差異,32位和64位框架之間也存在不同的錯誤,這種情況並不常見,但確實發生了。在過去的2個月中,我遇到過至少3種情況,其中相同的MSIL在定位x86時的行爲與在x64系統上定位AnyCPU時的行爲不同。 – 2009-07-21 03:38:15
如果應用程序的目標是AnyCPU,則運行時行爲將會有所不同,特別是內存使用情況和限制。
在64位上,不會有相同的32位內存限制(理論上2GB最大內存,實際上是1.2-1.6)。但是,所有的對象引用都是兩倍,所以64位系統會使用更多的內存。
此外,64位系統通常有額外的寄存器等,所以有時性能可能會略有提高。不過,這是特定於平臺的。
如果應用程序的目標是x86,它將在WoW64下運行,並且與它在32位系統中的行爲方式幾乎完全相同。
除了那些由Reed Copsey識別的方法之外,另一種方式可能是如果你的「純粹」應用程序碰巧使用了System.IntPtr結構體,或者它使用了不安全的代碼(這不是一回事作爲P/Invoke)和指針算術。
另一個值得關注的重點是召喚幾乎所有System.Runtime.InteropServices.Marshal類的東西。有各種各樣的令人敬畏的方式在那裏拍攝自己的腳(當然,當你需要它時非常有用)。
良好補充 – 2009-07-08 00:44:16
- 1. 64位文件系統與32位文件系統最大區別是什麼
- 2. Windows 64位操作系統上的32位或64位Android SDK?
- 3. 什麼告訴32位GCC在64位系統上,使64位二進制
- 4. 在32位操作系統和64位操作系統之間,類java.net.InetAddress有什麼區別
- 5. 爲什麼32位和64位numpy/pandas之間有區別
- 6. 在64位Windows上安裝32位或64位應用程序有什麼區別?
- 7. JNA在64位操作系統上具有32位JVM
- 8. 64位操作系統上的32位或64位應用程序?
- 9. 32位/ 64位操作系統?
- 10. 什麼數據類型是32位操作系統中的16位和64位操作系統中的32位?
- 11. 爲什麼setValue:forKey:在32位系統上失敗,但不是在64位?
- 12. 無論系統是32位還是64位,int都是32位還是64位?
- 13. ODBC .NET 32位和64位
- 14. 無論系統是32位還是64位,uint均爲32位?
- 15. 在32位或64位matlab上運行?
- 16. 32位和64位操作系統和處理器(Intel架構和Windows)之間有什麼區別
- 17. 32位.NET應用程序和64位.NET應用程序有區別嗎?
- 18. 64位.NET 4.5上的32位GetHashCode(CLR)
- 19. 在64位系統上註冊32位DLL
- 20. 在32/64位系統上使用16位指針的C++
- 21. 安裝在64位操作系統上的Windows 32位Eclipse?
- 22. 在64位系統上編譯32位二進制
- 23. 如何在64位系統上以32位模式編譯openSSL?
- 24. 在64位系統上檢測32位程序的安裝
- 25. 在64位系統上使用32位SQL服務器ODBC
- 26. 在64位操作系統上調試32位CASSINI(Oracle 9)
- 27. 在64位操作系統上啓動32位進程
- 28. 在64位系統(Ubuntu)上編譯32位程序集
- 29. 32位nasm程序集不在64位系統上啓動
- 30. 在64位和32位系統上運行程序
重複:http://stackoverflow.com/questions/145026 – 2009-07-08 00:45:09