Чем дескриптор отличается от указателя на объект, а также почему у нас не может быть ссылки на ссылку?
Ручка обычно непрозрачный ссылка на объект. Тип дескриптора не связан с указанным элементом. Рассмотрим, например, дескриптор файла, возвращаемый open()
системный вызов. Тип int
но он представляет собой запись в таблице открытых файлов. Фактические данные, хранящиеся в таблице, не связаны с int
который был возвращен open()
освобождение реализации от необходимости поддерживать совместимость (т. е. фактическая таблица может быть прозрачно реорганизована без влияния на код пользователя. Дескрипторы могут использоваться только функциями в том же интерфейсе библиотеки, которые могут переназначить дескриптор обратно на фактический объект.
Указатель — это комбинация адреса в памяти и типа объекта, который находится в этой ячейке памяти. Значением является адрес, тип указателя сообщает компилятору, какие операции можно выполнить через этот указатель, как интерпретировать расположение в памяти. Указатели прозрачный в том смысле, что указанный объект имеет конкретный тип, присутствующий в указателе. Обратите внимание, что в некоторых случаях указатель может служить дескриптором void*
полностью непрозрачный, указатель на пустой интерфейс такой же непрозрачный).
Рекомендации псевдонимы к объекту. Вот почему вы не можете иметь ссылку на ссылку: у вас может быть несколько псевдонимов для объекта, но вы не можете иметь псевдоним псевдонима. Как и с указателями ссылки набираются. В некоторых случаях ссылки могут быть реализованы компилятором как указатели, которые автоматически разыменовываются при использовании, в некоторых других случаях у компилятора могут быть ссылки, которые не имеют фактического хранилища. Важной частью является то, что они псевдонимы для объекта они должны быть инициализированы объектом и не могут быть повторно установлены для ссылки на другой объект после их инициализации. Как только они инициализируются, все виды использования ссылки являются использованиями реального объекта.
Чтобы даже задать вопрос: «Почему у нас не может быть ссылки на ссылку?» означает, что вы не понимаете, что ссылка является.
Ссылка — это другое имя для объекта; ничего более. Если у меня есть объект, хранящийся в переменной X, я могу создать переменную Y, которая является ссылкой на этот объект. Они оба говорят об одном и том же объекте, так что бы это значило иметь ссылку на Y? Это ничем не отличается от ссылки на X, потому что все они ссылаются на одно и то же.
«Дескриптор» не имеет определения в отношении языка C ++. Вообще говоря, «дескриптор» — это конструкция некоторой формы, которая представляет некоторый вид ресурса. Вы получаете это от некоторого API, который создает ресурс. Вы вызываете функции, которые принимают дескриптор в качестве параметра, чтобы запросить состояние ресурса или изменить его. И когда вы закончите с этим, вы передадите его какой-нибудь другой функции API.
Указатель мог быть ручкой Ссылка может быть ручкой. Объект может быть ручкой. целое число может быть ручкой. Все зависит от того, что система, которая реализует дескриптор, хочет сделать с ним.
handle
также иногда называют «волшебным печеньем». Это просто значение некоторого непрозрачного типа, которое идентифицирует объект. В некоторых случаях он реализован как фактический указатель, поэтому, если вы приведете его к указателю на правильный тип, вы можете разыменовать его и работать с любым видом, на который он указывает.
В других случаях он будет реализован как что-то отличное от указателя — например, у вас может быть таблица объектов этого типа, а дескриптор на самом деле является просто индексом этой таблицы. Если вы не знаете базовый адрес таблицы, вы ничего не можете сделать с индексом.
C ++ просто говорит, что ссылки на ссылки невозможны. Существует не так много способов «почему» — если бы они хотели достаточно сильно, они, несомненно, могли бы это позволить (а также массивы ссылок, если на то пошло). Однако было принято решение, что лучше всего ограничить ссылки (так много), так они и сделали.
Разница заключается в контексте.
Основное значение дескриптора в том, что он ссылается на некоторый объект в очень ограниченном контексте; например. ОС может хранить только 20 файлов, открытых для пользователя или pid. Указатель ссылается на тот же объект в контексте «памяти». И ссылка является «псевдонимом» объекта — это относится к объекту в контексте исходного кода; таким образом, ссылка на ссылку не существует, так как ссылка уже «является» объектом.