Quel que soit le compilateur, vous pouvez toujours enregistrer sur l'exécution si vous pouvez vous permettre de le faire
if (typeid(a) == typeid(b)) {
B* ba = static_cast<B*>(&a);
etc;
}
au lieu de
B* ba = dynamic_cast<B*>(&a);
if (ba) {
etc;
}
Le premier implique une seule comparaison des std::type_info
; le second implique nécessairement la traversée d'un arbre d'héritage plus des comparaisons.
Passé que ... comme tout le monde le dit, l'utilisation des ressources est mise en œuvre spécifique.
Je suis d'accord avec tous les autres commentaires que le demandeur devrait éviter RTTI pour des raisons de conception. Cependant, il sont de bonnes raisons d'utiliser RTTI (principalement en raison de boost::any). Dans cet esprit, il est utile de connaître ses réels de l'utilisation des ressources en commun des implémentations.
J'ai récemment fait un tas de recherches sur le RTTI dans GCC.
tl;dr: RTTI dans GCC utilise négligeable de l'espace et de l' typeid(a) == typeid(b)
est très rapide, sur de nombreuses plates-formes (Linux, BSD et peut-être les plateformes embarquées, mais pas mingw32). Si vous savez que vous aurez toujours être un béni plate-forme, RTTI est très proche de gratuit.
Détails:
GCC préfère utiliser un particulier de "neutre" ABI C++ [1], et utilise toujours cette ABI pour Linux et BSD cibles[2]. Pour les plates-formes qui prennent en charge cette ABI et aussi la faible articulation, typeid()
renvoie un uniforme et unique objet pour chaque type, même à travers la liaison dynamique des limites. Vous pouvez tester &typeid(a) == &typeid(b)
, ou simplement s'appuyer sur le fait que le portable de test typeid(a) == typeid(b)
fait, il suffit de comparer un pointeur interne.
Dans GCC préféré de l'ABI, une classe vtable toujours est titulaire d'un pointeur pour chaque type de RTTI de la structure, même si elle peut ne pas être utilisée. Ainsi, un typeid()
s'appeler lui-même doit seulement les coûts autant que tous les autres vtable de recherche (le même que l'appel d'une fonction membre virtuelle), et de RTTI de soutien ne devraient pas utiliser tout l'espace supplémentaire pour chaque objet.
À partir de ce que je peux faire, le RTTI structures utilisées par GCC (ce sont tous les sous-classes de std::type_info
) seulement quelques octets pour chaque type, à part le nom. Il n'est pas clair pour moi si les noms sont présents dans le code de sortie, même avec -fno-rtti
. De toute façon, le changement de la taille des binaires compilés devrait refléter le changement dans la mémoire d'exécution d'utilisation.
Une expérience rapide (à l'aide de GCC 4.4.3 sur Ubuntu 10.04 64 bits) montre que l' -fno-rtti
fait augmente la taille du binaire d'un programme de test simple de quelques centaines d'octets. Cela se produit de manière uniforme à travers des combinaisons de -g
et -O3
. Je ne suis pas sûr pourquoi, la taille de l'augmentation; une possibilité est que GCC du code STL se comporte différemment sans RTTI (depuis exceptions ne fonctionnera pas).
[1] Connu comme le Itanium ABI C++, documentée à http://www.codesourcery.com/public/cxx-abi/abi.html. Les noms sont horriblement confus: le nom fait référence à l'origine du développement de l'architecture, bien que l'ABI spécification travaille sur beaucoup d'architectures i686/x86_64. Commentaires dans GCC interne de la source et code STL reportez-vous à Itanium comme le "nouveau" ABI contrairement à la "vieille" une ils ont utilisé avant. Pire, la "nouvelle"/Itanium ABI fait référence à toutes les versions disponibles par le biais -fabi-version
; les "vieux" de LCA antérieurs à cette version. GCC a adopté le Itanium/versionnées/"nouveau" ABI dans la version 3.0, le "vieux" ABI a été utilisé dans de 2,95 et plus tôt, si je suis à la lecture de leurs changelogs correctement.
[2] je ne pouvais pas trouver toutes les listes de ressources std::type_info
objet de la stabilité de la plate-forme. Pour les compilateurs j'ai eu accès à l', j'ai utilisé le suivant: echo "#include <typeinfo>" | gcc -E -dM -x c++ -c - | grep GXX_MERGED_TYPEINFO_NAMES
. Cette macro contrôle le comportement de l' operator==
pour std::type_info
dans du CCG STL, comme de GCC 3.0. Je n'ai trouver que mingw32-gcc obéit à la Windows ABI C++, où std::type_info
objets ne sont pas uniques pour un type à travers les Dll, typeid(a) == typeid(b)
des appels strcmp
sous les couvertures. Je spécule que sur un seul programme de cibles embarquées comme AVR, où il n'y a pas de code pour le lien contre, std::type_info
des objets sont toujours stables.