Явный идентификатор типа против RTTI - PullRequest
5 голосов
/ 25 мая 2011

Есть ли преимущество использования вашего собственного идентификатора типа по сравнению с RTTI?

Например,

class A { virtual int mytype() = 0; };
class B : public A { int mytype() {return 1;} };
class C : public A { int mytype() {return 2;} };

Может ли это быть быстрее?Меньше накладных расходов?Или всегда следует использовать RTTI в такой ситуации?

Ответы [ 3 ]

6 голосов
/ 25 мая 2011

Не думайте, что RTTI будет иметь больше / меньше накладных расходов, чем ваше решение, прежде чем протестирует его .

Вы должны попробовать оба решения и измерить производительность, чтобы получить надежный ответ.

Я на самом деле задал себе тот же вопрос несколько лет назад, и в итоге я добавил переменную-член, чтобы "закрепить" тестирование типов, как вы это сделали. Оказалось, что мой код был излишне загроможден глупыми тестами, в то время как некоторые dynamic_cast<> сделали бы ту же самую работу (фактически лучшую работу).

Я реорганизовал код для использования dynamic_cast<> с тех пор, и я не вернусь.

Как примечание: если ваши классы полиморфны, вы все равно уже «заплатили» за это, так что просто перейдите с dynamic_cast<>.

5 голосов
/ 25 мая 2011

Недостатки (для полиморфных типов) с пользовательским идентификатором типа:

  1. Нужно вести учет каждого класс по наследству. Вам необходимо назначить уникальное целое число или значение перечисления для все классы в данной иерархии
  2. Скажи свою вертикаль наследование, как, A->B->D. В таких ситуациях, как A *p = new D;, пользовательская идентификация типа не позволит сопоставить B* с p (даже если оно действительно).

Вам необходимо знать об этих ситуациях. На другой имел,

  1. RTTI применяется только к полиморфные типы (так что цепочка наследования не содержит виртуальные функции не могут использовать RTTI)
  2. есть небольшая производительность уменьшение разницы из-за RTTI, если оно действительно имеет значение для вас

Но, как вы упомянули в своем комментарии, для более мелкой цепочки наследования нет никакого вреда в отслеживании вашей собственной типизации. например, * 1 021 *

struct Base {
  enum TYPES { _BASE, _D1, _D2, _D3 };
  const TYPES &myType;
  Base (TYPES) : myType(_BASE) {}
};

struct D1 : Base {
  D1 () : Base(_D1) {}
};
3 голосов
/ 25 мая 2011

http://en.wikibooks.org/wiki/C%2B%2B_Programming/RTTI

Есть некоторые ограничения для RTTI. Во-первых, RTTI можно использовать только с полиморфными типами. Это означает, что ваши классы должны иметь хотя бы одну виртуальную функцию, либо напрямую, либо через наследование. Во-вторых, из-за дополнительной информации, необходимой для хранения типов, некоторые компиляторы требуют специального переключателя для включения RTTI.

Так что, если вам нужно работать с классами без виртуальных функций, вам придется реализовать это самостоятельно.

...