Svoboda | Graniru | BBC Russia | Golosameriki | Facebook

To install click the Add extension button. That's it.

The source code for the WIKI 2 extension is being checked by specialists of the Mozilla Foundation, Google, and Apple. You could also do it yourself at any point in time.

4,5
Kelly Slayton
Congratulations on this excellent venture… what a great idea!
Alexander Grigorievskiy
I use WIKI 2 every day and almost forgot how the original Wikipedia looks like.
Live Statistics
English Articles
Improved in 24 Hours
Added in 24 Hours
What we do. Every page goes through several hundred of perfecting techniques; in live mode. Quite the same Wikipedia. Just better.
.
Leo
Newton
Brights
Milds

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

Из Википедии — свободной энциклопедии

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

Реализация

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

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

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

C++

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

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

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

Оператор typeid[2] возвращает ссылку на структуру 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.
Эта страница в последний раз была отредактирована 8 марта 2023 в 19:02.
Basis of this page is in Wikipedia. Text is available under the CC BY-SA 3.0 Unported License. Non-text media are available under their specified licenses. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc. WIKI 2 is an independent company and has no affiliation with Wikimedia Foundation.