Подтвердить что ты не робот

Указатель против ручек в C (это термины, используемые для передачи отдельных вещей?)

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

В белой бумаге я имею в виду: Дафф, Херу и Позо. Обзор базовых подпрограмм линейной алгебры Sparse: новый стандарт Технического форума BLAS. ACM Transactions on Mathematical Software, Vol. 28, No. 2, June 2002, Pages 239-267.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Обычно вы не использовали бы "handle" для обозначения "указатель на структуру". Ручка больше похожа на "токен", чем на "указатель". Он ссылается на что-то: файл, системный ресурс, память, состояние-снимок и т.д. Но что именно-это-то, основано на контексте самого дескриптора (т.е. Кто выдал дескриптор).

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

-AD.

Ответ 6

Термин "дескриптор" не обозначался в Windows, хотя он широко распространился среди программистов Windows.

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

Дескриптор - это общий термин для ссылки (а не только ссылки на С++) для объекта.

Указатель - это подмножество дескриптора, поскольку он указывает на объекты.

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

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

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

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

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

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

Ответ 15

Фактически указатель представляет собой переменную, которая содержит адрес другой переменной, но дескриптор является указателем на указатель i.e указатель, который содержит адрес другого указателя ДЛЯ EX:

int x=10;

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

int *b=a;// this is a handle