【发布时间】:2023-10-09 00:16:01
【问题描述】:
前言
所以在做了很长一段时间的纯 C 工作后,我回到了 Delphi,发现 Delphi 中有一些新东西。一个是 NativeInt。
令我惊讶的是,我发现 Delphi 和 C 处理它们的“本机整数”1 类型对于 x86-64 是不同的。 Delphi NativeInt 似乎表现得像 C void * 和 Delphi Pointer,这与我对名称的期望相反。
在 Delphi NativeInt 中是 64 位大小。用代码表示:
SizeOf(NativeInt) = SizeOf(Pointer) = SizeOf(Int64) = 8
C 只有 64 位指针。 int 仍然是 32 位。用代码表示2:
sizeof(int) == 4 != sizeof(void *) == 8
即使是 Free Pascal 编译器3 也同意 NativeInt 的大小。
问题
为什么 Delphi NativeInt 选择 64 位而 C int 选择 32 位?
当然,根据语言文档/规范,两者都是有效的。但是,“语言允许”并不是一个真正有用的答案。
我想这与执行速度有关,因为这是当今 C 语言的主要卖点。*和其他来源都说 x86-64 确实有 64 位操作数寄存器。但是,它们还声明默认操作数大小为 32 位。那么,与 32 位操作数相比,对 64 位操作数的操作可能会更慢?或者也许 64 位寄存器可以同时进行 2 个 32 位操作?有这个原因吗?
编译器的创建者选择这些大小可能还有其他原因吗?
脚注
- 我将 Delphi NativeInt 与 C int 进行比较,因为名称/规范表明它们具有相似的目的。我知道还有 Delphi Integer,其行为类似于 Delphi 中 x68 和 x86-64 上的 C int。
- sizeof() 在 C 中返回大小为 char 的倍数。但是,char 在 x86-64 上为 1 个字节。
- 它在 Delphi 模式和 NativeInt 的默认模式下这样做。默认模式下的其他整数类型完全是另一回事。
【问题讨论】:
-
NativeInt可能更像来自<stdint.h>标准标头(C99 标准)的intptr_t,并且intptr_t可能大于int(但它与@987654329 大小相同@) -
SizeOf(Char) = 2 自 2009 年以来。 NativeInt 和 NativeUInt 在 D2009 之前都是错误的。
-
...这就是为什么我更喜欢 FPC 的
PtrInt PtrUInt语法的原因。这是FPC中的正确方式:FPC在Delphi之前为Win64编译! “NativeInt”仅用于与 Delphi 兼容。 “原生”到底是什么意思? blog.synopse.info/post/2010/08/10/… -
@LURD 不,RP 的意思是
sizeof(char)根据定义等于 C 上的 1。即使char是 16 位宽,那么sizeof(char)也是 1。换句话说,sizeof()以char为单位测量大小。 -
@RotatingPieces,
native表示与处理器的位大小一致。即 32 位处理器上的 32 位和 x86-64 上的 64 位。在 128 位处理器上,它仍然是原来的两倍。
标签: c delphi x86-64 pascal sizeof