2010-04-08 39 views
0

我最近不得不在Delphi和C++中用於枚舉的不同默認大小,因爲我必須從delphi應用程序使用C++ dll。關於Delphi和C++在64位環境中的枚舉

一個函數調用返回一個結構數組(或delphi中的記錄),其第一個元素是一個枚舉。

爲了使這項工作,我使用打包記錄(或對齊(1) - 結構)。但是,由於delphi默認動態選擇一個枚舉變量的大小,並使用最小的數據類型(在我的例子中是一個字節),但C++對枚舉使用int,所以我的數據解釋不正確。

德爾福提供了一個編譯器開關來解決這個問題,所以在枚舉的聲明變得

{$Z4} 
    TTypeofLight = 
    (
     V3d_AMBIENT, 
     V3d_DIRECTIONAL, 
     V3d_POSITIONAL, 
     V3d_SPOT 
    ); 
    {$Z1} 

我的問題是:

  • 當他們在編什麼會成爲我的結構的/對於64位環境?
  • 默認的C++整數增長到8字節嗎?
  • 是否還有其他內存對齊/數據類型大小修改(除了指針)?

回答

2

Delphi沒有64位編譯器,所以你不能編譯64位的程序。但是,您仍然可以編譯它,並將其作爲32位進程在64位操作系統上運行。在這種情況下,注意會發生在你的結構上。

庫的問題有點複雜:如果將它編譯爲64位庫,則根本無法將其加載到32位進程中。然而,假設你要編譯64位,然後從64位進程中使用它,那麼int變量的實際長度最可能保持32位(對於所有情況,情況並非如此,雖然)。

查看一些更多的信息這個維基百科文章:

http://en.wikipedia.org/wiki/64-bit#Specific_data_models

+0

感謝您的意見。 +1 – sum1stolemyname 2010-04-08 11:34:04

+0

(有一些主機單位是ILP64,iow整數= 64位,但你不太可能用普通的Delphi碰到它們) – 2010-04-08 12:14:22

3

Delphi的支持64位彙編整數大小將保持4個字節,與指針增加至8 FreePascal的具有PtrInt和PtrUInt類型是「大到足以容納指針的整數」,Delphi可能會添加類似的東西。

由於您明確聲明枚舉大小,即使您在整數大小增加的平臺上,它們仍將保留4個字節,因爲通常它們只會是1個字節。在佈置解壓後的數據結構時,現有規則將應用,該字段根據類型的大小進行對齊,因此整數將以4字節對齊,並且Int64和指針將以8字節對齊。

Wikipedia有一個table顯示了各種64位操作系統的數據類型大小,但現在推斷Embarcadero將如何處理其他64位平臺(Linux和OS X)還爲時尚早。

+2

Delphi已經有這些類型的IntPtr和UIntPtr。 – 2010-04-08 17:22:21

+1

FPC似乎不支持8字節的枚舉(例如使用$ packenum):錯誤:非法的枚舉最小大小說明符「8」。 (順便說一句:在FPC添加PtrInt(2005年時間範圍)之後,IntPtr僅在後來的Delphi版本中添加,因此有所不同。) – 2010-04-08 21:16:45