2009-10-14 107 views
13

64位預計不會在未來版本的支持不再等待可能遷移現有的代碼庫爲Unicode的選項,64時,64位也準備一次性使用。 但是,如果我們在做unicode轉換時已經可以爲我們的64位代碼做好準備,那將會很不錯。這將最大限度地減少2020年出現的影響。 任何建議如何在不引入太多混亂的情況下實現這一目標,直到2020年纔會到達?如何遷移到德爾福2010年和Unicode

+1

以下問題也可能有一些幫助:http://stackoverflow.com/questions/4051603/how-should-i-prepare-my-32-bit-delphi-programs-for-an-最終-64位編譯器 – Justin 2010-11-01 04:37:20

回答

7

首先,看看在那裏你與非德爾福庫和API的調用, 它們可能會有所不同交互的地方。在Win32上,stdcall調用轉換的庫被命名爲_SomeFunction @ 4(@ 4表示參數的大小等)。在Win64上,只有一個調用約定,並且dll中的函數不再被修飾。如果你從dll文件導入函數,你可能需要調整它們。

請記住,在一個64位的exe文件中,你不能加載一個32位的dll,所以,如果你依賴於第三方的dll文件,你也應該檢查這些文件的64位版本。

而且,看整數,如果你依賴於他們的最大值,例如,當你讓他們的溢出和等待發生的那一刻,如果一個整數的大小改變會引起麻煩。

此外,與流工作時,你想序列不同的數據,與包括一個整數,就會造成麻煩,因爲整數的大小改變,你的數據流將是不同步的。

所以,你在哪裏取決於整數或指針的大小的地方,你將需要做出調整。在序列化sush數據時,還需要記住這個大小問題,因爲它可能會導致32位和64位版本之間的數據不兼容。

此外,帶有Lazarus IDE的FreePascal編譯器已經支持64位。這種替代的Object Pascal編譯器與Borland/Codegear/Embarcadero的Pascal方言不是100%兼容的,因此只需重新編譯64位就可能不那麼簡單,但它可能有助於指出64位的問題。

6

轉換爲64位應該不會很痛苦。從有意識的角度出發,關注一個整數的大小。不要使用「整數」,而應使用Int32作爲32位大小的整數,Int64作爲64bits大小的整數。在最後一次比特轉換中,Integer的定義從Int16變爲Int32,所以通過指定確切的比特深度來保證它的安全。

如果您有任何內聯彙編,創建一個相當於帕斯卡,並創建一些單元測試,以確保它們的操作方式相同。對兩者進行一些時間測試,看看組件運行速度是否足夠保持。如果確實如此,那麼您將需要根據需要對兩者進行更改。

+3

依賴整數大小的一個特殊情況是,依賴整數和指針爲*相同*大小,無論大小如何。另外,假設整數和*手柄*的大小相同。 Delphi將句柄當作整數處理,但API將它們定義爲指針。 – 2009-10-14 21:20:49

2

使用NativeInt作爲可包含鑄造指針的整數。

+1

澄清:需要與指針(即32或64位)大小相同的帶符號和無符號類型可以分別聲明爲NativeInt和NativeUInt。 – PhiS 2009-10-15 06:49:09

20

another similar question,但我會在這裏重複我的回答也一樣,以確保儘可能多的人看到這樣的信息:

首先起來,免責聲明:雖然我對Embarcadero公司工作。我不能爲我的僱主說話。我要寫的是基於我自己對於假設的64位德爾福應該如何工作的看法,但是可能會或可能不會有相互競爭的意見和其他預見或不可預見的不兼容性和事件,從而導致做出替代性設計決策。

這就是說:

  • 有兩種整數類型,NativeInt和NativeUInt,將根據平臺 浮子32位和64位之間,其尺寸。他們一直在 左右的不少發行。根據目標的位數,其他整數類型將不會更改大小 。

  • 確保依賴於鑄造的指針值到 整數或反之亦然的任何地方使用NativeInt或NativeUInt爲整數 類型。在Delphi的更高版本中TComponent.Tag應該是NativeInt。

  • 我建議請勿將NativeInt或NativeUInt用於非基於指針的值。儘量保持你的代碼在語義上在32位和64位之間相同。如果你需要32位的範圍,使用Integer;如果你需要64位,使用Int64。這樣你的代碼應該在兩個位上運行相同的代碼。只有當你在某種類型的指針值(例如引用或THandle)中進行轉換時,才應該使用NativeInt。

  • 指針狀的東西應該遵循類似的規則,以指針:對象 引用(明顯),但還搞什麼HWND,THandle等

  • 不要依賴於字符串和動態數組的內部細節,如 其頭部數據。

  • 我們對64位API的變化一般政策應該是保持32位和64位在可能的 相同的API,即使這意味着 64位API並不一定利用的機器。例如,對於 的例子,TList可能只會處理MaxInt div SizeOf(指針) 元素,以便將Count,索引等保持爲Integer。由於 整數類型不會浮動(即根據比特度更改大小),所以我們 不希望對客戶代碼產生連鎖反應:任何通過整數類型變量或for-loop翻轉的索引索引, 將被截斷並可能導致微妙的錯誤。

  • 哪裏的API擴展64位,他們將最有可能與 做一個額外的功能/方法/屬性來訪問額外的數據,這 API也將在32位的支持。例如,Length()標準的 例程可能會返回Integer類型的值,其參數爲 類型字符串或動態數組;如果想要處理非常大的動態數組,則可能會有一個LongLength()例程,其32位的實現與Length()相同。如果應用於包含多個232 元素的動態數組,則Length()將拋出 64位異常。

  • 與此相關的是,可能會改進語言中的縮小操作的錯誤檢查,尤其是將64位值 縮小到32位位置。如果Length(), 返回Int64,這將達到將長度返回值分配給Integer類型的位置的可用性。另一方面,對於類似於Length()的編譯器魔術 ,可能有一些優點,例如所採用的魔法,例如 。根據上下文切換返回類型。但優勢不可能是 類似的非魔術API。

  • 動態數組可能會支持64位索引。請注意,即使在64位平臺上,Java 陣列也僅限於32位索引。

  • 字符串可能僅限於32位索引。我們也很難 時間想出現實的原因,人們想要4GB +字符串 真的是字符串,數據的不只是管理的斑點,對於這 動態數組可以用來一樣好。

  • 也許一個內置的彙編,但有限制,比如不能夠自由地與Delphi代碼混合;還有一些規則需要在x64上遵循異常和堆棧框架佈局。