Что такое длинный указатель? - PullRequest
33 голосов
/ 23 февраля 2010

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

Ответы [ 2 ]

40 голосов
/ 23 февраля 2010

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

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

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

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

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

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

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

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

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

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

28 голосов
/ 23 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...