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

Динамическая идентификация типа данных ( англ. r un- t ime t ype i nformation, r un- t ime t ype i dentification, RTTI ) — механизм в некоторых языках программирования , который позволяет определить тип данных переменной или объекта во время выполнения программы.

Реализация

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

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

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

C++

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

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

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

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

Delphi

Компилятор 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 .

Perl

В Perl тип объекта может быть определён с помощью функции blessed(), являющейся частью CPAN-модуля Scalar::Util. Функция принимает указатель на объект (blessed hash или аналог) и возвращает скаляр, содержащий имя класса.

PHP

В стандартной библиотеке PHP определена функция gettype() , которая возвращает строку с именем встроенного типа или строку object , если тип переданного функции аргумента - определённый пользователем класс.

См. также

Примечания

  1. . Дата обращения: 18 мая 2010. Архивировано из 14 марта 2011 года.
  2. Подбельский В. В. 12.6 Динамическая идентификация типов (RTTI) // Язык Си++ / Рец. Дадаев Ю. Г.. — 4-е изд. — М. : Финансы и статистика, 2003. — С. 263—280. — 560 с. — ISBN 5-279-02204-7 , УДК 004.438Си(075.8) ББК 32.973.26-018 1я173.
Источник —

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