указатель против дескрипторов в C (термины, используемые для передачи отдельных вещей?) - PullRequest
20 голосов
/ 17 декабря 2009

Недавно я прочитал официальный документ человека, который ссылается на указатель на структуру как на дескриптор. Автор был явно кто-то, кто ранее писал код C на платформе Windows. Поиск в Google указывает, что программисты Windows взаимодействуют с компонентами системы через дескрипторы. Я задаюсь вопросом, является ли обычной практикой для программистов Windows ссылаться на все указатели структур как на дескрипторы? Или термин дескриптор предназначен для обозначения чего-либо, кроме указателя на структуру? Я спрашиваю как программист Linux C.

Белая книга, на которую я ссылаюсь: Дафф, Эру и Позо. Обзор подпрограмм разреженной базовой линейной алгебры: новый стандарт от технического форума BLAS. Транзакции ACM по математическому программному обеспечению, том 28, № 2, июнь 2002 г., стр. 239-267.

Ответы [ 15 ]

1 голос
/ 17 декабря 2009

Дескрипторы, как правило, указатели, которые вам не нужно напрямую разыменовывать. Скорее вы передаете их вызовам API, которые работают с базовыми структурами.

Исторически в Windows дескрипторы не были указателями. Вы заблокируете дескриптор, чтобы получить указатель перед его использованием, и разблокируете его, когда закончите (и указатель станет недействительным). За несколько дней до постраничной памяти Windows старой школы осуществляла собственное управление памятью, заменяя ресурсы, на которые ссылаются только дескрипторы, и меняя их обратно, когда они были заблокированы. На практике это делало управление памятью кошмаром, но позволяло Windows моделировать виртуальную память в системах без аппаратной поддержки.

1 голос
/ 17 декабря 2009

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

В любом случае дескриптор обычно предназначен как непрозрачный тип данных - то есть вы не должны ничего знать о его значении, только набор предопределенных операций, которые могут использовать его для выполнения различных задач. Я считаю, что C ++ / CLI также имеет объект, похожий на указатель, который называется дескриптором. Я полагаю, что он должен быть ближе к непрозрачному типу данных - если память служит, вы не можете использовать любую арифметику указателей для них.

0 голосов
/ 30 января 2013

Фактически указатель - это переменная, которая содержит адрес другой переменной, но дескриптор - это указатель на указатель, т.е. указатель, который содержит адрес другого указателя Например:

int x=10;

int *a=&x;// this is a simple pointer

int *b=a;// this is a handle
0 голосов
/ 18 декабря 2012

Я, вероятно, старше, чем большинство респондентов, заработав живую кодировку на C как в раннем (конце 80-х) Macintosh, так и в 16- и 32-битных Windows. В те древние времена (когда мэйнфрейм IBM мог иметь только 256 КБ памяти) дескриптор всегда был указателем (или смещением таблицы) на указатель памяти.

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

0 голосов
/ 17 декабря 2009

Указатель определенно отличается от дескриптора. Указатель - это адрес чего-то неуказанного в памяти. Указатель на структуру можно назвать «дескриптором» (обычно с помощью «typedef»).

Дескриптор - это понятие, используемое при написании операционной системы Windows. Указатель является частью языка C.

...