传统观点:
In the latest version of VBA (VBA7),use the
LongPtr
type to represent pointers, which works on both 32 and 64-bit systems. In old versions of VBA, useLong
to represent pointers (assuming a 32-bit host, but this is a safe assumption as all 64-bit hosts use the latest version of VBA).
LongPtr 到底是什么?嗯根据VBA language reference :
LongPtr
(Long
integer on 32-bit systems,LongLong
integer on 64-bit systems)
这两条信息证实了一个事实:在 32 位系统上,指针占用 4 个字节,应该存储在 Long
中,在 64 位系统上,指针占用 8 个字节并且应该存储在 LongLong
通过扩展,LongPtr
在底层看起来有点像这样:
#If Win64 Then
typedef LongPtr As LongLong
#Else
typedef LongPtr As Long
#End If
即指针大小直接与主机位数相关。根据我的经验,这种解释一直很有效。
<小时/>问题
正如 this question 中指出的,指针往往的大小与架构的位数相同。例如。对于32位程序,指针是4字节,对于64位程序,指针是8字节。 但是没有理由一定会出现这种情况;具有 64 位内存大小的程序仍可能使用 32 位指针来导航。
你仔细想想,这是有道理的。仅仅因为我的 64 位程序使用 8 字节 block 来分割其内存,并不意味着我需要 2^64 个不同的可能指针来导航它。我总共可能只有 16 个字节的内存,在这种情况下我的指针可能只是 1
或 0
!
所以我的问题:
- LongPtrs 是根据主机位数定义的吗?
- 如果是这样,是否有理由认为这样做是安全的 - VBA 是否有某些东西意味着指针将始终与主机程序的位数匹配?
- 如果不是,它们是如何定义的?
- 与宿主程序使用的编译器有关吗?
- Excel、Word 或 SolidWorks 主机之间的指针长度是否会有所不同?
最佳答案
第 2.3 节之前的两段
https://interoperability.blob.core.windows.net/files/MS-VBAL/%5bMS-VBAL%5d.pdf
“还定义了实现定义的 LongPtr 类型别名,映射到实现将用于保存指针或句柄值的基础声明类型。32 位实现应将 LongPtr 映射到 Long,64 位实现应映射 LongPtr到 LongLong,尽管实现可以将 LongPtr 映射到实现定义的指针类型。LongPtr 类型别名在其底层声明类型有效的任何地方都有效。”
关于vba - VBA 中指针大小的真正决定因素是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61026947/