Что означает «базовый» в Pointer.getPointerArray JNA (длинная база) и Pointer.getStringArray (длинная база)? - PullRequest
3 голосов
/ 11 сентября 2011

Что означает «базовый» в JNA

Pointer.getPointerArray(long base) 
Pointer.getStringArray(long base)

Документация JNA для указателя не объясняет, к какой «базе» это относится.

Если это база для форматирования текста, то почему она также передается в getPointerArray?

Может ли это относиться к числу битов адреса памяти? Зачем ему это нужно (если в java он сам не может это понять, а если нет, то как я мог?)

А если это ширина адреса, зачем использовать long? Готовимся к будущему? Предусматривает ли проект JNA массивную машину с шиной адресов памяти шириной 1E19?

Должен ли он быть длинным со всеми битами, установленными в 1?

Может ли это относиться к аппаратной базе хост-машины? Может ли это быть что-то кроме 2 для двоичного?

Это должно быть смещение?

Может ли это быть символ завершения массива? Что если мой символ завершения превышает 64 бита? Что если оно меньше 64 бит?

1 Ответ

1 голос
/ 12 сентября 2011

Копаясь в источнике JNA для класса Pointer,

Pointer.getPointerArray(long base)
Pointer.getStringArray(long base)

... очевидно, ссылаются на 'base' в контексте адресов адресации памяти base + address , найденных на ассемблере/ аппаратный уровень, где один регистр будет хранить адрес памяти, в то время как второй регистр будет хранить смещение по этому адресу, которое автоматически суммируется во время доступа к памяти.В идеале указатель должен быть «базовым адресом», и, перебирая содержимое памяти, вы будете корректировать адрес «смещения».

Таким образом, в основном «base» означает «смещение» вэтот контекст: он начинается в «базовых» байтах после расположения указателя, а затем выплевывает объекты Pointer / String на основе адресов, которые он читает из этих частей памяти, пока не найдет нулевое значение.Я предполагаю, что причина использования слова «base» связана с внутренним кодированием метода:

Он создает второй объект Pointer на основе самого себя, но передает ваш аргумент «base» в виде «смещения»', а затем создает индексную переменную с именем' смещение '... да.Затем он выполняет итерацию, увеличивая смещение на размер адресного слова в байтах (обычно 8), пока не прочитает нулевое значение.

Так как 'смещение' уже используется в качестве локальной переменной, оно будет конфликтовать с параметром смещения, поэтому кодер назвал параметр смещения метода 'base'.

...