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

Что такое дескриптор на С++?

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

4b9b3361

Ответ 1

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

Например, HWND в Win32 API является дескриптором для окна. Само по себе это бесполезно: вы не можете извлечь из него какую-либо информацию. Но передайте его в правильные функции API, и вы можете выполнить с ним множество разных трюков. Внутренне вы можете думать о HWND как об индексе в таблице графиков GUI (что может и не быть так, как оно реализовано, но это делает магию понятной).

РЕДАКТИРОВАТЬ: Не 100% уверены, что конкретно вы задавали в своем вопросе. В основном это говорит о чистом C/С++.

Ответ 2

Ручка - это указатель или указатель без прикрепленного к нему видимого типа. Обычно вы видите что-то вроде:

 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);
     }
 }

Ответ 3

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

Было бы точнее сказать, что указатель - это один тип дескриптора, но не все ручки - указатели.

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

Главное, что когда у вас есть "дескриптор", вы не знаете и не заботитесь о том, как этот дескриптор фактически заканчивает идентификацию того, что он идентифицирует, все, что вам нужно знать, это то, что он делает.

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

Ответ 4

В С++/CLI дескриптор представляет собой указатель на объект, расположенный на куче GC. Создание объекта в (неуправляемой) куче С++ достигается с помощью new, а результат выражения new является "нормальным" указателем. Управляемый объект выделяется в GC (управляемой) куче с выражением gcnew. Результатом будет ручка. Вы не можете выполнять арифметику указателей на ручках. У вас нет свободных ручек. ГК позаботится о них. Кроме того, GC может свободно перемещать объекты в управляемой куче и обновлять ручки, чтобы указывать на новые местоположения во время работы программы.

Ответ 5

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

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

Ответ 6

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

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

typedef void *HANDLE;

Узнайте больше о РУЧКАХ

Ответ 7

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

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

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

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

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