Мне сказали, что дескриптор является своего рода указателем, но не указателем, и что он позволяет вам сохранять ссылку на объект, а не на сам объект. Какое более подробное объяснение?
Мне сказали, что дескриптор является своего рода указателем, но не указателем, и что он позволяет вам сохранять ссылку на объект, а не на сам объект. Какое более подробное объяснение?
Ответы:
Дескриптором может быть что угодно, от целочисленного индекса до указателя на ресурс в пространстве ядра. Идея состоит в том, что они предоставляют абстракцию ресурса, поэтому вам не нужно много знать о самом ресурсе, чтобы использовать его.
Например, HWND в Win32 API - это дескриптор окна. Сам по себе он бесполезен: вы не можете почерпнуть из него никакой информации. Но передайте его нужным функциям API, и вы сможете выполнять с ним множество различных трюков. Внутренне вы можете рассматривать HWND как просто индекс в таблице окон графического интерфейса пользователя (что может не обязательно совпадать с тем, как он реализован, но в этом есть смысл).
РЕДАКТИРОВАТЬ: Не уверен на 100%, что конкретно вы задавали в своем вопросе. В основном речь идет о чистом C / C ++.
Дескриптор - это указатель или индекс без прикрепленного к нему видимого типа. Обычно вы видите что-то вроде:
typedef void* HANDLE;
HANDLE myHandleToSomething = CreateSomething();
Поэтому в вашем коде вы просто передаете HANDLE как непрозрачное значение.
В коде, который использует объект, он приводит указатель к реальному типу структуры и использует его:
int doSomething(HANDLE s, int a, int b) {
Something* something = reinterpret_cast<Something*>(s);
return something->doit(a, b);
}
Или он использует его как индекс для массива / вектора:
int doSomething(HANDLE s, int a, int b) {
int index = (int)s;
try {
Something& something = vecSomething[index];
return something.doit(a, b);
} catch (boundscheck& e) {
throw SomethingException(INVALID_HANDLE);
}
}
Дескриптор - это своего рода указатель, обычно это способ ссылки на какой-либо объект.
Было бы точнее сказать, что указатель - это один из типов дескрипторов, но не все дескрипторы являются указателями.
Например, дескриптор также может быть некоторым индексом в таблице в памяти, которая соответствует записи, которая сама содержит указатель на некоторый объект.
Ключевым моментом является то, что когда у вас есть «дескриптор», вы не знаете и не заботитесь о том, как этот дескриптор на самом деле в конечном итоге идентифицирует то, что он идентифицирует, все, что вам нужно знать, это то, что он делает.
Также должно быть очевидно, что не существует однозначного ответа на вопрос «что такое дескриптор», потому что дескрипторы для разных вещей, даже в одной и той же системе, могут быть реализованы разными способами «под капотом». Но вам не стоит беспокоиться об этих различиях.
В C ++ / CLI дескриптор - это указатель на объект, расположенный в куче сборщика мусора. Создание объекта в (неуправляемой) куче C ++ достигается с помощью, new
а результатом new
выражения является «нормальный» указатель. Управляемый объект размещается в куче GC (управляемой) с gcnew
выражением. В результате получится ручка. Вы не можете выполнять арифметические операции с указателями для дескрипторов. У вас нет свободных ручек. GC позаботится о них. Кроме того, сборщик мусора может перемещать объекты в управляемой куче и обновлять дескрипторы, чтобы они указывали на новые местоположения во время работы программы.
Это появляется в контексте идиомы Handle-Body-Idiom , также называемой идиомой Pimpl. Это позволяет сохранить ABI (двоичный интерфейс) библиотеки одним и тем же, сохраняя фактические данные в другом объекте класса, на который просто ссылается указатель, содержащийся в объекте «дескриптор», состоящем из функций, которые делегируют этому классу » Тело ».
Также полезно включить постоянное время и безопасный обмен исключениями двух объектов. Для этого нужно просто поменять местами указатель, указывающий на объект body.
Ручка - это то, что вы хотите.
Дескриптор может быть целым числом без знака, используемым в некоторой таблице поиска.
Дескриптор может быть указателем на более крупный набор данных или на него.
Это зависит от того, как ведет себя код, использующий дескриптор. Это определяет тип ручки.
Причина, по которой используется термин « ручка », - вот что важно. Это указывает на них как на тип идентификации или доступа к объекту. Это означает, что для программиста они представляют собой «ключ» или доступ к чему-либо.
HANDLE hnd;
такой же как void * ptr;
HANDLE - это typedef, определенный в файле winnt.h в Visual Studio (Windows):
typedef void *HANDLE;
Узнать больше о РУЧКА