前言
所以在做了很长一段时间的纯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 Compiler 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的默认模式下这样做。默认模式下的其他整数类型完全是另一种蠕虫。