Что на самом деле диктует размер указателя в VBA? - PullRequest
3 голосов
/ 04 апреля 2020

Общепринятое мнение:

В последней версии VBA (VBA7) используйте тип LongPtr для представления указателей, который работает как в 32-, так и в 64-битных системах. В старых версиях VBA используйте Long для обозначения указателей (предполагается, что 32-разрядный хост, но , это безопасное предположение , поскольку все 64-разрядные хосты используют последнюю версию VBA).

А что такое LongPtr? Хорошо согласно справочнику по языку VBA :

LongPtr (Long целое число в 32-разрядных системах, LongLong целое число в 64-разрядных системах)

Эти две части информации подтверждают один факт: В 32-разрядных системах указатели занимают 4 байта и должны храниться в Long, в 64-разрядных системах указатели занимают 8 байтов и должны быть сохраненным в LongLong

и, соответственно, LongPtr выглядит под капотом примерно так:

#If Win64 Then
    typedef LongPtr As LongLong
#Else
    typedef LongPtr As Long
#End If

т.е. размер указателя напрямую связан с битностью хоста , По моему опыту, эта интерпретация всегда работала нормально.


Задача

Как указывалось в , этот вопрос , указатели имеют тенденцию быть такой же размер, как битность архитектуры. Например, для 32-битной программы указатели - 4 байта, для 64-битной программы - 8 байтов. Однако нет никаких причин для этого обязательно ; программа с 64-битным объемом памяти может по-прежнему использовать 32-битные указатели для навигации по ней.

Это дает вам смысл подумать об этом. То, что моя 64-битная программа использовала 8-байтовые блоки для разделения своей памяти, не означает, что мне нужно 2 ^ 64 различных возможных указателя для навигации по ней. У меня может быть всего 16 байтов памяти, в этом случае мой указатель может быть просто 1 или 0!


Итак, мои вопросы:

  • LongPtrs определяется в соответствии с битностью хоста?
  • Если да, то есть ли причина, по которой это безопасно? - есть ли что-то в VBA, что означает, что указатели всегда будут соответствовать размеру разрядности хост-программы?
  • Если нет, то как они определили?
    • Это как-то связано с компилятором, используемым для хост-программы?
    • Будет ли длина указателя изменяться в зависимости от хостов Excel или Word или SolidWorks?

1 Ответ

1 голос
/ 04 апреля 2020

два абзаца перед разделом 2.3

https://interoperability.blob.core.windows.net/files/MS-VBAL/%5bMS-VBAL%5d.pdf

"Также определен псевдоним типа LongPtr, определенный реализацией, который сопоставляется с базовым объявленным типом, который будет реализовывать реализация используйте для хранения указателя или обработки значений. 32-битным реализациям СЛЕДУЕТ отображать LongPtr на Long, а 64-битным реализациям СЛЕДУЕТ отображать LongPtr на LongLong, хотя реализации МОГУТ отображать LongPtr на тип указателя реализации. Псевдоним типа LongPtr действует везде, где его базовый объявленный тип действителен. "

...