Динамическая идентификация типа данных

Материал из Seo Wiki - Поисковая Оптимизация и Программирование

Перейти к: навигация, поиск

Динамическая идентификация типа данных (англ. Run-time type information, Run-time type identification, RTTI) — механизм в некоторых языках программирования, который позволяет определить тип данных переменной или объекта во время выполнения программы.

Содержание

Реализация

Существует множество реализаций такого механизма, но наиболее распространенными являются:

  • таблица указателей на объекты;
  • хранение информации об объекте в памяти вместе с ним.

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

C++

В C++ для динамической идентификации типов применяются операторы dynamic_cast и typeid, для использования которых информацию о типах во время выполнения обычно необходимо добавить через опции компилятора при компиляции модуля.

Оператор dynamic_cast пытается выполнить приведение к указанному типу с проверкой. Целевой тип операции должен быть типом указателя, ссылки или void*.

  • Если целевой тип — тип указателя, то аргументом должен быть указатель на объект класса.
  • Если целевой тип — ссылка, то аргумент должен также быть соответствующей ссылкой.
  • Если целевым типом является void*, то аргумент также должен быть указателем, а результатом операции будет указатель, с помощью которого можно обратиться к любому элементу «самого производного» класса иерархии, который сам не может быть базовым ни для какого другого класса.

Оператор typeid возвращает ссылку на структуру type_info, которая содержит поля, позволяющие получить информацию о типе.

Delphi

Компилятор Borland Delphi сохраняет в исполняемом файле программы информацию обо всех классах, используемых в ней. При создании любого объекта в памяти перед ним (по отрицательным смещениям) располагается заголовок, в котором есть в том числе ссылка на структуру-описатель класса этого объекта. Встроенные в язык функции работают с этой информацией прозрачно для программиста. Оператор is позволяет проверить, является ли объект или тип наследником определённого типа, а оператор as является аналогом dynamic_cast в C++.

Заголовки объектов — также неявно — используются для автоматического управления памятью.

C#

В C# для определения типа объекта во время исполнения используется метод GetType, а также ключевые слова is и as, которые являются аналогами для typeid и dynamic_cast в C++ соответственно.

Java

В Java тип объекта может быть получен при помощи метода getClass(), объявленного в классе java.lang.Object и потому реализуемого каждым классом. Для проверки принадлежности объекта определенному типу испольуется оператор instanceof, аналогом dynamic_cast из C++ является оператор приведения типа, который в случае несоответствия типов выбрасывает исключение ClassCastException.

На уровне байт-кода вызов метода класс записывается, как и вызов всякого другого метода, при помощи опкода invokevirtual. Для проверки приводимости объекта к типу используются опкоды instanceof и checkcast.


de:Runtime Type Information

en:Run-time type information fr:Run-time type information it:RTTI ja:実行時型情報 pl:RTTI pt:Runtime Type Information ro:Runtime Type Information zh:執行期型態訊息

Личные инструменты

Served in 0.082 secs.