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

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

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

Ответы [ 15 ]

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

Термин дескриптор обычно означает некоторое непрозрачное значение, которое имеет значение только для API, который его создал. В Win32 тип HANDLE является либо указателем в памяти ядра (к которому приложения в любом случае не могут получить доступ), либо индексом в некоторый внутренний массив ядра.

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

Ручка - это старая и почитаемая концепция.

Печенье - это почти то же самое. Или GUID. Или билет, чтобы забрать свой автомобиль с автостоянки, или ваше пальто из модного ресторана и т. Д.

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

Он интенсивно использовался Windows, но, конечно, не уникален для Windows.

Обычно вы не используете «handle» для обозначения «указатель на структуру». Дескриптор больше похож на «токен», чем на «указатель». Это относится к чему-то - файлу, системному ресурсу, памяти, состоянию снимка и т. Д. Но что именно это основано на контексте самого дескриптора (то есть, кто выпустил дескриптор). 1013 *

Дескрипторы также широко использовались в раннем программировании файловой системы в K & R C.

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

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

Часто дескрипторы реализованы как непрозрачные void *, что является дополнительным стимулом не пытаться напрямую разыменовать его.

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

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

«Дескриптор памяти» (который похож на указатель на структуру) - это концепция из области 16-битного программирования Windows, где в CPU не было менеджера памяти, и все управление памятью должно было выполняться в программного обеспечения. По сути, «дескриптор» был своего рода указателем, но ОС могла свободно перемещаться по памяти, на которую ссылался дескриптор. Вы не можете сделать это с обычным указателем, но у дескриптора были функции, которые бы получали и освобождали фактический адрес памяти.

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

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

«Ручка» - это логический термин, а не физический. Он предназначен в качестве посредника физического объекта для кода, который обладает более глубокими знаниями об объекте. Указатель на структуру является одним из таких прокси, но есть много других возможностей.

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

Термин «дескриптор» не встречался в Windows, хотя он стал широко распространенным среди программистов Windows.

В стандартной библиотеке C (stdio.h) файловые дескрипторы являются указателями на структуру данных, используемую библиотекой C.

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

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

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

-AD.

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

A handle - это общий термин для ссылки (не конкретно ссылки на C ++) на объект.

A указатель является подмножеством handle , так как он указывает на объекты.

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

В среде Windows API они использовали абстрактный термин handle , чтобы они могли использовать целое число в таблице, указателе или других методах, не мешая клиенту; IOW, определяя абстрактный интерфейс.

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

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

В старые времена программирования на MacOS еще до OSX дескриптор был указателем на указатель. Это позволило ОС перемещать вещи без аннулирования указателей пользователя. Существовали правила, когда можно было предположить, что объект, на который указывает указатель, не будет двигаться, что я не помню.

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

Нет, среди программистов Windows не так часто называть указатели дескрипторами, но это тоже НЕ ПРАВДА. Термин «дескриптор» обычно используется для описания чего-то, через что вы получаете доступ, и в этом смысле все дескрипторы указателей (но не все дескрипторы являются указателями). Дескрипторы Win32 - это AFAIK, как правило, не указатели, а индексы для внутренних таблиц ОС - но это может измениться в будущих версиях Windows.

...