Ближний и дальний указатели - PullRequest
34 голосов
/ 06 октября 2010

В чем разница между нашими обычными указателями (которые мы обычно используем), ближними и дальними указателями, и есть ли практическое применение для ближних и дальних указателей в современных системах C / C ++?Любой практический сценарий, который требует использования этих конкретных указателей, а не другой семантики c, c ++, будет очень полезным.

Ответы [ 2 ]

48 голосов
/ 06 октября 2010

Ближайшие и дальние ключевые слова берут свое начало в модели сегментированной памяти, которую Intel имела раньше.Ближайшие указатели могли получить доступ только к блоку памяти, изначально размером около 64 КБ, который называется сегментом, тогда как дальние указатели могли выходить за пределы этого диапазона, состоящего из сегмента и смещения в этом сегменте.Ближайшие указатели были намного быстрее, чем дальние указатели, поэтому в некоторых контекстах им было выгодно использовать их.

В настоящее время с виртуальной памятью ближние и дальние указатели не используются.

РЕДАКТИРОВАТЬ: Извините, если яя не использую правильные термины, но вот как я запомнил это, когда работал с ним в тот день: -)

0 голосов
/ 23 ноября 2018

О ближнем и дальнем говорят в контексте машинной архитектуры (x86, x64, 640kb + модель памяти, x32 в среднем защищенного режима и сегментированный, x86 в терминах сегментированной памяти)

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

В настоящее время только адресация x86 x32 - длинный указатель и 64-битная адресация x64 занимают и занимают (постоянное) место. Да, x64 в Windows компилируется MS VC так, как он «видит», все еще как приложение x86 x32 ТОЛЬКО 4 ГБ памяти. Таким образом, вы не знаете по умолчанию разницу между ближним и дальним или какой-либо другой адресацией. НО x64 target имеет возможность обращаться к памяти, используя другой длинный указатель типа long.

Как вы видите, в MS VC нет практического сценария, если вы не «видите» вариант адресации x64 поверх x32 в разных указателях. Просто гипотетика.

Держаться подальше от этого практического использования LP_STRING - длинный указатель на строку а также INT_PTR - целое число, содержащее значение указателя.

Сначала вы должны понять, что ЦП и компилятор принимают набор размеров указателей для использования. И только их. Вы не можете найти способ обойти их без дополнительных компиляторов / компоновщиков / оборудования. INT_PTR - просто для хранения указателей, длина которых не превышает int (значение указателя, где длина указателя не превышает int). и LP_STRING - это просто длинный тип указателя компилятора / процессора (они оба, как абстракции, так и компилятор не равны в поведении компилятору, так как x64 может быть Intel редко используется один и широко используется AMD).

ЛЮБОЙ размер переменной может быть указателем.

Вам просто нужен практический пример против AMD x64 и LLP (длинный длинный указатель).

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