vba - VBA 中指针大小的真正决定因素是什么?

标签 vba pointers 32bit-64bit portability

传统观点:

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, use Long 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 个字节的内存,在这种情况下我的指针可能只是 10!

<小时/>

所以我的问题:

  • 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/

相关文章:

excel - VBA 调试器仅显示集合的 256 个元素

excel - 如何按百分比分配总数,其中每个单元格都是整数,并且它们的总和恰好等于原始总数?

c - 通过引用传递c中的指针数组

C# Mono/.NET差分CAD软件检索

用于读取事件程序的 VBA 代码

C 关于指针的错误

c++ - 指向引用的指针是否指向引用的地址或值?

java - 在 Java 应用程序中混合运行 32 位和 64 位 native 库

c++ - Linux下检测64位环境下是否运行32位进程

用于将多个电子表格的第一列与母版表进行比较的 VBA 代码