Вопрос

Мне сказали, что дескриптор — это своего рода указатель, но это не так, и что он позволяет вам сохранять ссылку на объект, а не на сам объект.Какое более подробное объяснение?

Это было полезно?

Решение

Дескриптор может быть чем угодно: от целочисленного индекса до указателя на ресурс в пространстве ядра.Идея состоит в том, что они предоставляют абстракцию ресурса, поэтому вам не нужно много знать о самом ресурсе, чтобы его использовать.

Например, 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 дескриптор — это указатель на объект, расположенный в куче GC.Создание объекта в (неуправляемой) куче C++ достигается с помощью new и результат new выражение является «обычным» указателем.Управляемый объект размещается в куче GC (управляемой) с помощью gcnew выражение.Результатом будет ручка.Вы не можете выполнять арифметические операции с указателями на дескрипторах.Вы не освобождаете ручки.О них позаботится GC.Кроме того, сборщик мусора может свободно перемещать объекты в управляемой куче и обновлять дескрипторы, чтобы они указывали на новые местоположения во время работы программы.

Это появляется в контексте Ручка-Тело-Идиома, также называемый идиомой Pimpl.Это позволяет сохранить ABI (двоичный интерфейс) библиотеки неизменным, сохраняя фактические данные в другом объекте класса, на который просто ссылается указатель, содержащийся в объекте-дескрипторе, состоящем из функций, которые делегируют этому классу " Тело".

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

Ручка — это то, что вы хотите.

Дескриптор может быть целым числом без знака, используемым в некоторой справочной таблице.

Дескриптор может быть указателем на больший набор данных или на него.

Это зависит от того, как ведет себя код, использующий дескриптор.Это определяет тип ручки.

Причина, по которой термин 'ручка' используется, вот что важно.Это указывает на них как на тип идентификации или доступа к объекту.Это означает, что для программиста они представляют собой «ключ». или доступ к чему-либо.

HANDLE hnd; такой же как void * ptr;

HANDLE — это определение типа, определенное в файле winnt.h в Visual Studio (Windows):

typedef void *HANDLE;

Подробнее о РУЧКА

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top