Что такое дескриптор в C++?



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

3542   7  

7 ответов:

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

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

EDIT: не на 100% уверен, что конкретно вы задавали в своем вопросе. В основном речь идет о чистом C/C++.

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

 typedef void* HANDLE;
 HANDLE myHandleToSomething = CreateSomething();

поэтому в вашем коде вы просто передаете дескриптор как непрозрачное значение.

в коде, который использует объект, он приводит указатель к реальному типу структуры и использует его:

 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 и результат a new выражение является" нормальным " указателем. Управляемый объект выделяется в куче GC (managed) с помощью gcnew выражение. Результатом будет дескриптор. Вы не можете сделать арифметику указателя на дескрипторах. Вы не освобождаете ручки. О них позаботится ГК. Кроме того, GC может свободно перемещать объекты в управляемой куче и обновите маркеры, чтобы они указывали на новые местоположения во время работы программы.

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

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

HANDLE hnd; is same as void * ptr;

HANDLE-это тип, определенный в winnt.H файл в visual studio (windows).

Я.с: typedef void *HANDLE;

подробнее о дескриптор

дескриптор будет таким, каким вы хотите его видеть.

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

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

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

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

Comments

    Ничего не найдено.