我最近不得不解决 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 字节?
- 是否有其他内存对齐/数据类型大小修改(指针除外)?
最佳答案
当Delphi 支持 64 位编译时,整数大小将保持 4 字节,指针增加到 8。FreePascal 有 PtrInt 和 PtrUInt 类型,它们“整数足以容纳指针”和 Delphi大概会添加类似的东西。
由于您明确声明了枚举大小,因此即使您在整数大小增加的平台上,它们也将保持 4 字节,因为通常它们只会是 1 字节。在布置未打包的数据结构时,将应用现有规则,字段根据类型的大小对齐,因此整数将按 4 字节对齐,而 Int64 和指针将按 8 字节对齐。
维基百科有一个 table显示了各种 64 位操作系统的数据类型大小,但现在推断 Embarcadero 将如何处理其他 64 位平台(Linux 和 OS X)还为时过早。
关于c++ - 关于 64 位环境中 Delphi 和 C++ 中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2598535/