关于64位环境中的Delphi和c ++中的枚举

时间:2010-04-08 08:41:45

标签: c++ delphi 64-bit portability enumeration

我最近不得不解决Delphi和c ++中用于枚举的不同默认大小,因为我必须使用delphi应用程序中的c ++ dll。

一个函数调用返回一个结构数组(或delphi中的记录),其第一个元素是枚举。

为了使这项工作,我使用打包记录(或对齐(1) - 结构)。但是,由于delphi默认情况下动态选择枚举变量的大小并使用尽可能小的数据类型(在我的情况下它是一个字节),但是C ++对枚举使用了int,我的数据没有被正确解释。

Delphi提供了一个编译器开关来解决这个问题,因此enum的声明变为

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

我的问题是:

  • 在64位环境中编译时,我的结构会变成什么样?
  • 默认的c ++整数是否增长到8字节?
  • 是否有其他内存对齐/数据类型大小修改(指针除外)?

2 个答案:

答案 0 :(得分:3)

Delphi支持64位编译时,整数大小将保持4个字节,指针增加到8. FreePascal有PtrInt和PtrUInt类型,它们是“大到足以容纳指针的整数”和Delphi可能会添加类似的东西。

由于您明确声明了枚举大小,即使您在整数大小增加的平台上,它们仍将保持4个字节,因为通常它们只有1个字节。在布置解压缩的数据结构时,将应用现有规则,根据类型的大小对齐字段,因此整数将是4字节对齐,Int64和指针将是8字节对齐。

维基百科有table显示各种64位操作系统的数据类型大小,但现在推断Embarcadero将如何处理其他64位平台(Linux和OS X)还为时尚早。

答案 1 :(得分:2)

Delphi没有64位编译器,因此您无法为64位编译程序。但是,您仍然可以编译它并在64位操作系统上以32位进程运行它。在这种情况下,注意到你的结构会发生。

库的问题有点复杂:如果将其编译为64位库,则根本无法在32位进程中加载​​它。但是,假设您要将其编译为64位然后从64位进程使用它,那么int变量的实际长度很可能会保持32位(对于所有内容来说都不是这样,虽然)。

有关更多信息,请参阅此维基百科文章:

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