gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:56:54 25 4
gpt4 key购买 nike

传统观点:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com