Rot*_*ces 7 c delphi pascal x86-64 sizeof
经过很长一段时间的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
Run Code Online (Sandbox Code Playgroud)
C只有64位指针.int仍然是32位.代码2中表示:
sizeof(int) == 4 != sizeof(void *) == 8
Run Code Online (Sandbox Code Playgroud)
甚至Free Pascal编译器3也同意NativeInt的大小.
为什么Delphi NativeInt选择64位,C int选择32位?
当然,根据语言文档/规范,两者都是有效的.但是,"语言允许它"并不是一个真正有用的答案.
我想这与执行速度有关,因为这是今天C的主要卖点.维基百科和其他消息来源都说x86-64确实有64位操作数寄存器.但是,它们还声明默认操作数大小为32位.因此,与32位操作数相比,64位操作数的操作可能更慢?或者64位寄存器可以同时执行2个32位操作?这是一个原因吗?
编译器的创建者是否确实选择了这些尺寸?
Dav*_*nan 10
NativeInt
只是一个与指针大小相同的整数.因此,它改变了不同平台上的大小.该文件说,正是:
NativeInt的大小等于当前平台上指针的大小.
主要用途NativeInt
是存储操作系统句柄之类的东西,后台实际上是内存地址.您不应该使用它来执行算术运算,存储数组长度等.如果您尝试这样做,那么在程序的32位和64位版本之间共享代码会变得更加困难.
你可以认为Delphi NativeInt
直接等同于.net类型IntPtr
.在C和C++中,OS句柄类型通常被声明为void*
指针类型而不是整数类型.但是,如果你愿意,你最好使用类似的类型intptr_t
.
您使用术语"本机整数"来描述NativeInt
,但是尽管名称很重要,但要意识到这NativeInt
不是语言的本机整数类型.那就是Integer
.native in NativeInt
指的是底层硬件平台而不是语言.
Delphi类型Integer
(语言本机整数)与C类型int
(相应的语言本机类型)匹配.在Windows上,32位和64位系统的这些类型都是32位宽.
当Windows设计人员开始使用64位Windows时,他们对int
从16位到32位系统的转换中从16位更改为32位时所发生的事情有了敏锐的记忆.这根本不好玩,虽然这显然是正确的决定.这一次,从32到64,没有令人信服的理由使int
64位类型.如果Windows设计师这样做了,那么移植工作就会变得更加困难.因此他们选择以int
32位类型离开.
在性能方面,AMD64架构设计为在32位类型上高效运行.由于32位整数是64位整数的一半,因此通过int
在64位系统上仅使用32位来减少存储器使用.这将带来性能优势.
几条评论:
NativeInt
是64位大小".事实并非如此.根据目标,它可以是32位或64位宽. 归档时间: |
|
查看次数: |
1575 次 |
最近记录: |