Мені сказали, що дескриптор - це свого роду вказівник, але ні, і що він дозволяє зберігати посилання на об’єкт, а не на сам об’єкт. Що є більш детальним поясненням?
Мені сказали, що дескриптор - це свого роду вказівник, але ні, і що він дозволяє зберігати посилання на об’єкт, а не на сам об’єкт. Що є більш детальним поясненням?
Відповіді:
Дескриптор може бути будь-яким - від цілочисельного індексу до вказівника на ресурс у просторі ядра. Ідея полягає в тому, що вони забезпечують абстракцію ресурсу, тому вам не потрібно знати багато про сам ресурс, щоб використовувати його.
Наприклад, 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 може вільно переміщувати об'єкти в керованій купі та оновлювати дескриптори, щоб вказувати на нові місця, поки програма працює.
Це з’являється в контексті ідіоми Handle-Body-Idiom , яку також називають ідіомою Pimpl. Це дозволяє зберегти ABI (двійковий інтерфейс) бібліотеки однаковим, зберігаючи фактичні дані в іншому об'єкті класу, на який просто посилається вказівник, що міститься в об'єкті "handle", що складається з функцій, які делегують цьому класу " Тіло ».
Корисно також увімкнути постійний обмін двома об’єктами за часом та виключеннями. Для цього потрібно просто поміняти місцями лише вказівник, що вказує на об’єкт body.
Ручка - це все, що ти хочеш.
Ручкою може бути ціле число без підпису, яке використовується в деякій таблиці пошуку.
Ручка може бути вказівником на більший набір даних або на них.
Це залежить від того, як поводиться код, який використовує дескриптор. Це визначає тип ручки.
Причиною використання терміна " ручка " є те, що важливо. Це вказує на них як на ідентифікаційний об'єкт або тип доступу. Це означає, що для програміста вони представляють "ключ" або доступ до чогось.
HANDLE hnd;
те саме, що void * ptr;
HANDLE - це typedef, визначений у файлі winnt.h у Visual Studio (Windows):
typedef void *HANDLE;
Детальніше про HANDLE