【问题标题】:About enumerations in Delphi and c++ in 64-bit environments关于 64 位环境中 Delphi 和 c++ 中的枚举
【发布时间】:2010-04-08 08:41:44
【问题描述】:

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

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

为了完成这项工作,我使用了打包记录(或对齐 (1) 结构)。但是,由于 delphi 默认动态选择枚举变量的大小并使用可能的最小数据类型(在我的例子中是字节),但 C++ 使用 int 表示枚举,我的数据没有被正确解释。

Delphi 提供了一个编译器开关来解决这个问题,所以枚举的声明变成了

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

我的问题是:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • FPC 似乎也不支持 8 字节枚举(例如使用 $packenum):错误:非法枚举最小大小说明符“8”。 (顺便说一句:IntPtr 仅在 FPC 添加 PtrInt(2005 年时间框架)之后的 Delphi 版本中添加,因此有所不同。)
    【解决方案2】:

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

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

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

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

    【讨论】:

    • (有一些大型机 unices 是 ILP64,iow integer=64 位,但你不太可能使用纯 Delphi 遇到它们)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多