Что такое длинный указатель?

Я читаю книгу, и она упоминает определенный тип данных, как являющийся длинным указателем. Просто любопытный на предмет того, что это означало. Спасибо.

34
задан Peter Alexander 23 February 2010 в 00:33
поделиться

2 ответа

Некоторые процессоры имеют два типа указателей: ближний указатель и дальний указатель. Ближний указатель уже (следовательно, имеет ограниченный диапазон), чем дальний указатель. Дальний указатель также может быть длинным указателем.

Некоторые процессоры предлагают относительную адресацию для вещей поблизости. Длинный указатель может указывать на то, что элемент не находится поблизости и относительную адресацию использовать нельзя.

В любом случае длинные указатели являются проблемой конкретной платформы и могут не переноситься на другие операционные системы или платформы.

Редактировать: (дальнейшее объяснение и использование относительной адресации)

Адресные расстояния - это не столько концепция высокого уровня, сколько концепция языка ассемблера. Расстояние измеряется от программного счетчика (текущий или следующий адрес) и начала объекта (функции или данных). Если местоположение превышает предел для небольшого относительного указателя, потребуется более длинный указатель.

Пример: дана система с 32-битной «длинной» адресацией и 8-битной относительной адресацией.Относительное расстояние позволяет использовать не менее 127 байтов в прямом (положительное значение) или предыдущем (отрицательное) направлении. Если цель удалена на 1024 байта, необходимо использовать полный 32-битный указатель.

Это функция оптимизации, основанная на концепции, что большинство инструкций и данных находятся рядом. У большинства петель небольшое расстояние между началом и концом петли. Они используют относительную адресацию для исполнения.

Большая часть данных находится поблизости, будь то константа данных или переменная. Более подробно, данные находятся около кадра или контрольной точки. Локальные переменные помещаются в стек относительно кадра или базового адреса. Этот базовый адрес является началом стека перед выполнением функции . Таким образом, к данным можно получить доступ, используя адресацию относительно начала кадра стека.

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

Длинная и короткая, ближняя и дальняя адресация может зависеть от области данных или функции. Есть и другие факторы, такие как PIC (позиционно-независимый код), виртуальная память и подкачка.

40
ответ дан 27 November 2019 в 16:37
поделиться

В зависимости от того, насколько старая книга, она может относиться к сегментированным архитектурам, где существовало два различных "размера" указателей: ближние указатели, которые указывали на локальный сегмент (и умещались в 16 бит), и дальние или длинные указатели, которые могли указывать на другой сегмент (и поэтому были больше). Вот почему в Win32 API встречаются такие типы, как LPVOID: LPVOID - это "длинный (дальний) указатель на пустоту", т.е. указатель на любое место в памяти.

Использование LP и NP - это пережиток Win16 и сегментированных процессорных архитектур того времени. В современной Windows, с ее плоскими виртуальными адресными пространствами, ближние и дальние указатели, как правило, представляют лишь археологический интерес: существует только один вид указателей, и вы можете игнорировать классификаторы "ближний" и "дальний/ближний".

29
ответ дан 27 November 2019 в 16:37
поделиться