Что такое дескриптор в C ++?
Мне сказали, что дескриптор — это своего рода указатель, но нет, и он позволяет вам хранить ссылку на объект, а не на сам объект. Что является более сложным объяснением?
7 ответов
Дескриптором может быть что угодно: от целочисленного индекса до указателя на ресурс в пространстве ядра. Идея состоит в том, что они обеспечивают абстракцию ресурса, поэтому вам не нужно много знать о самом ресурсе, чтобы использовать его.
Например, HWND в Win32 API является дескриптором для окна. Само по себе это бесполезно: вы не можете извлечь из него какую-либо информацию. Но передайте его в правильные функции API, и вы можете выполнить с ним множество разных трюков. Внутренне вы можете думать о HWND как об индексе в таблице графиков GUI (что может и не быть так, как оно реализовано, но это делает магию понятной).
РЕДАКТИРОВАТЬ: Не 100% уверены, что конкретно вы задавали в своем вопросе. В основном это говорит о чистом C/С++.
Ручка — это указатель или указатель без прикрепленного к нему видимого типа. Обычно вы видите что-то вроде:
Итак, в вашем коде вы просто передаете HANDLE вокруг как непрозрачное значение.
В коде, который использует объект, он переводит указатель на реальный тип структуры и использует его:
Или он использует его как индекс для массива/вектора:
дескриптор — это своего рода указатель на то, что он обычно является способом ссылки на какой-либо объект.
Было бы точнее сказать, что указатель — это один тип дескриптора, но не все ручки — указатели.
Например, дескриптор может также быть некоторым индексом в таблице памяти, которая соответствует записи, которая сама содержит указатель на какой-либо объект.
Главное, что когда у вас есть «дескриптор», вы не знаете и не заботитесь о том, как этот дескриптор фактически заканчивает идентификацию того, что он идентифицирует, все, что вам нужно знать, это то, что он делает.
Также должно быть очевидно, что нет единого ответа на вопрос «что такое дескриптор», потому что дескрипторы разных вещей, даже в одной и той же системе, могут быть реализованы по-разному «под капотом». Но вам не нужно беспокоиться об этих различиях.
Это появляется в контексте Идиомы Ручка-Тело, также называемой Идиома Пимпл. Это позволяет сохранить ABI (двоичный интерфейс) библиотеки таким же, сохраняя фактические данные в другом объекте класса, на который просто ссылается указатель, содержащийся в объекте «handle», состоящем из функций, делегирующих этому классу » Тело».
Также полезно включить постоянное время и исключительную безопасную замену двух объектов. Для этого нужно просто поменять указатель на объект body.
Что такое дескриптор в C++?
Мне сказали, что дескриптор-это своего рода указатель, но нет, и что он позволяет вам сохранять ссылку на объект, а не сам объект. Что такое более подробное объяснение?
7 ответов:
дескриптор может быть любым от целочисленного индекса до указателя на ресурс в пространстве ядра. Идея заключается в том, что они обеспечивают абстракцию ресурса, поэтому вам не нужно много знать о самом ресурсе, чтобы использовать его.
например, HWND в Win32 API является дескриптором для окна. Само по себе это бесполезно: вы не можете извлечь из него никакой информации. Но передайте его в правильные функции API, и вы можете выполнять с ним множество различных трюков. Внутренне вы можете подумайте о HWND как просто индекс в таблице графического интерфейса windows (что может быть не обязательно так, как это реализовано, но это имеет смысл).
EDIT: не на 100% уверен, что конкретно вы задавали в своем вопросе. В основном речь идет о чистом C/C++.
дескриптор-это указатель или индекс, к которому не прикреплен видимый тип. Обычно вы видите что-то вроде:
поэтому в вашем коде вы просто передаете дескриптор как непрозрачное значение.
в коде, который использует объект, он приводит указатель к реальному типу структуры и использует его:
или он использует его в качестве индекса для массива / вектора:
дескриптор и своего рода указатель в том, что это обычно способ ссылки на некоторую сущность.
точнее было бы сказать, что указатель-это один тип дескриптора, но не все дескрипторы являются указателями.
например, дескриптор может также быть некоторым индексом в таблице в памяти, которая соответствует записи, которая сама содержит указатель на некоторый объект.
главное, что когда у вас есть «ручка», вы не знаете и не заботитесь о том, как эта ручка на самом деле заканчивается идентификацией того, что она идентифицирует, все, что вам нужно знать, это то, что она делает.
также должно быть очевидно, что нет единого ответа на вопрос «что именно является ручкой», потому что ручки для разных вещей, даже в одной и той же системе, могут быть реализованы по-разному «Под капотом». Но вам не нужно беспокоиться об этих различиях.
В C++/CLI дескриптор-это указатель на объект, расположенный в куче GC. Создание объекта в (неуправляемой) куче C++ достигается с помощью new и результат a new выражение является» нормальным » указателем. Управляемый объект выделяется в куче GC (managed) с помощью gcnew выражение. Результатом будет дескриптор. Вы не можете сделать арифметику указателя на дескрипторах. Вы не освобождаете ручки. О них позаботится ГК. Кроме того, GC может свободно перемещать объекты в управляемой куче и обновите маркеры, чтобы они указывали на новые местоположения во время работы программы.
Это появляется в контексте Handle-Body-Idiom, также называемые идиомы Pimpl. Это позволяет сохранить ABI (двоичный интерфейс) библиотеки тем же самым, сохраняя фактические данные в другой объект класса, на который просто ссылается указатель, удерживаемый в объекте «дескриптор», состоящий из функций, которые делегируют этому классу «тело».
также полезно включить постоянное время и исключение безопасной замены двух объектов. Для этого просто указатель, указывающий на объект тела должен быть заменен.
HANDLE-это тип, определенный в winnt.H файл в visual studio (windows).
Я.с: typedef void *HANDLE;
подробнее о дескриптор
дескриптор будет таким, каким вы хотите его видеть.
дескриптор может быть целым числом без знака, используемым в некоторой таблице подстановки.
дескриптор может быть указателем на больший набор данных или в него.
Это зависит от того, как ведет себя код, который использует дескриптор. Это определяет тип дескриптора.
Почему термин ‘дескриптор ‘ используется то, что важно. Это указывает на них как на тип идентификации или доступа к объекту. В смысле, к программист, они представляют собой ‘ключ’ или доступ к чему-то.
Что такое дескриптор c
После создания окна, создающая функция возвращает дескриптор окна (window handle) , который уникально идентифицирует окно. Дескриптор окна имеет тип данных HWND; прикладная программа должна использовать этот тип при объявлении переменной, которая содержит в себе дескриптор окна. Прикладная программа использует этот дескриптор в других функциях, чтобы направить их действия на это окно.
Прикладная программа может использовать функцию FindWindow , чтобы выявить, существует ли в системе окно с заданным именем класса или именем окна. Если такое окно существует, FindWindow возвращает дескриптор окна. Чтобы ограничить поиск в дочерних окнах отдельной прикладной программы, используйте функцию FindWindowEx .
Функция IsWindow определяет, правильно ли идентифицирует дескриптор окна существующее окно. Имеются специальные константы, которые могут заменять дескриптор окна в некоторых функциях. Например, приложение может использовать HWND_BROADCAST в функциях SendMessage и SendMessageTimeout или HWND_DESKTOP в функции MapWindowPoints .
дескриптор файла
Здравствуйте. Насколько я понял в языке С каждому потоку ввода/вывода присваивается некоторое неотрицательное число — дескриптор. Хотелось бы понять каким образом он используется для идентификации потока и что будет по ходу работы программы если для некоторого указателя на FILE изменить его поле _file (дескриптор). Заранее благодарен.
Насколько я понял в языке С каждому потоку ввода/вывода присваивается некоторое неотрицательное число — дескриптор.
Это не в языке С. Это в ОС *NIX. На самом деле это число не дескриптор, а указатель на файловый дескриптор. Точнее — индекс в таблице файловых дескрипторов, которую ведёт ОС. Три первых позиции в этой таблицы заняты всегда:
- 0 — stdin
- 1 — stdout
- 2 — stderr
В самом дескрипторе есть поле, указывающее на конкретный файл. Записав в это поле некоторое значение, мы можем перенаправить ввод/вывод в другой файл, как это делается с помощью символов ‘>’ и ‘<‘ в командной строке.
Начиная с № 3, файловые дескрипторы не имеют фиксированного смысла. Они связываются с конкретными файлами в зависимости от поступающих вызовов open() / close().
Для того, что бы в программе выполнить перенаправление ввода/вывода, можно использовать функцию freopen.
Попытка «по мясу» подменить файловый дескриптор вряд-ли кончится чем-то хорошим.