加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi SizeOf(NativeInt)与x86-64上的C sizeof(int).为什么尺寸

发布时间:2020-12-15 04:20:44 所属栏目:大数据 来源:网络整理
导读:前言 经过很长一段时间的C工作后,我回到Delphi,发现Delphi中有一些新东西.一个是NativeInt. 令我惊讶的是,我发现Delphi和C处理x86-64不同的“本机整数”1种类型. Delphi NativeInt似乎表现得像C void *和Delphi Pointer,这与我对名称的期望相反. 在Delphi中,
前言

经过很长一段时间的C工作后,我回到Delphi,发现Delphi中有一些新东西.一个是NativeInt.

令我惊讶的是,我发现Delphi和C处理x86-64不同的“本机整数”1种类型. Delphi NativeInt似乎表现得像C void *和Delphi Pointer,这与我对名称的期望相反.

在Delphi中,NativeInt的大小为64位.在代码中表达:

SizeOf(NativeInt) = SizeOf(Pointer) = SizeOf(Int64) = 8

C只有64位指针. int仍然是32位. Code2中表示:

sizeof(int) == 4 != sizeof(void *) == 8

甚至Free Pascal Compiler3也同意NativeInt的大小.

为什么Delphi NativeInt选择64位,C int选择32位?

当然,根据语言文档/规范,两者都是有效的.但是,“语言允许它”并不是一个真正有用的答案.

我想这与执行速度有关,因为这是今天C的主要卖点.维基百科和其他消息来源都说x86-64确实有64位操作数寄存器.但是,它们还声明默认操作数大小为32位.因此,与32位操作数相比,64位操作数的操作可能更慢?或者64位寄存器可以同时执行2个32位操作?这是一个原因吗?

是否有其他原因编译器的创建者确实选择了这些尺寸?

脚注

>我将Delphi NativeInt与C int进行比较,因为名称/规范表明它们具有相似的目的.我知道还有Delphi Integer,其行为类似于x68上的C int和Delphi中的x86-64.
> sizeof()返回C中多个char的大小.但是,x86-64上的char是1个字节.
>它在Delphi模式和NativeInt的默认模式下都是这样.默认模式下的其他整数类型是其他整个蠕虫类型.

解决方法

NativeInt只是一个与指针大小相同的整数.因此,它改变了不同平台上的大小. documentation确切地说:

The size of NativeInt is equivalent to the size of the pointer on the current platform.

NativeInt的主要用途是存储操作系统句柄之类的东西,后台实际上是内存地址.您不应该使用它来执行算术运算,存储数组长度等.如果您尝试这样做,那么在程序的32位和64位版本之间共享代码会变得更加困难.

您可以将Delphi NativeInt视为直接等效于.net类型IntPtr.在C和C中,OS句柄类型通常被声明为void *,它是指针类型而不是整数类型.但是,如果你愿意的话,你最好使用像intptr_t这样的类型.

您使用术语“本机整数”来描述NativeInt,但是尽管名称非常重要,但要意识到NativeInt不是该语言的本机整数类型.那将是整数. NativeInt中的本机是指底层硬件平台而不是语言.

Delphi类型Integer(语言本机整数)与C类型int匹配,相应的语言本机类型.在Windows上,32位和64位系统的这些类型都是32位宽.

当Windows设计人员开始使用64位Windows时,他们对于在从16位到32位系统的转换中int从16位更改为32位时所发生的事情有了敏锐的记忆.这根本不好玩,虽然这显然是正确的决定.这一次,从32到64,没有令人信服的理由使int为64位类型.如果Windows设计师这样做了,那么移植工作就会变得更加困难.所以他们选择将int作为32位类型.

在性能方面,AMD64架构设计为在32位类型上高效运行.由于32位整数的大小是64位整数的一半,因此通过在64位系统上仅使用32位来减少内存使用量.这将带来性能优势.

几条评论:

>您声明“C只有64位指针”.事实并非如此. 32位C编译器通常使用具有32位指针的平坦32位存储器模型.>您还说,“在Delphi中,NativeInt的大小为64位”.事实并非如此.根据目标,它可以是32位或64位宽.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读