Quel est le coût d'avoir une méthode virtuelle dans une classe C++?

Ayant au moins une méthode virtuelle dans une classe C++ (ou l'une de ses classes parentes) signifie que la classe aura une table virtuelle, et chaque instance aura un pointeur virtuel.

De sorte que le coût mémoire est tout à fait clair. Le plus important est le coût mémoire sur les instances (en particulier si les instances sont de petite taille, par exemple, s'ils sont destinés à contenir un entier: dans ce cas avoir un pointeur virtuel dans tous les cas, peut doubler la taille des instances. Comme pour l'espace mémoire utilisé par les tables virtuelles, je suppose que c'est généralement négligeable par rapport à l'espace utilisé par le code de la méthode.

Cela m'amène à ma question: est-il mesurable de la performance des coûts (c'est à dire l'impact de la vitesse) pour la présentation d'une méthode virtuelle? Il y aura une recherche dans la table virtuelle au moment de l'exécution, lors de chaque appel de méthode, donc si il y a très souvent des appels à cette méthode, et si cette méthode est très court, alors il pourrait y avoir un rendement mesurables frapper? Je suppose que ça dépend de la plate-forme, mais quiconque a exécuté quelques repères?

La raison que je demande, c'est que je suis tombé sur un bug qui est arrivé à être en raison d'un programmeur oublier de définir une méthode virtuelle. Ce n'est pas la première fois que je vois ce genre d'erreur. Et j'ai pensé: pourquoi ne nous ajouter le mot clé virtual lorsque nécessaire, au lieu de retrait le mot clé virtual lorsque nous sommes absolument convaincus qu'il est pas nécessaire? Si le coût est faible, je pense que je vais tout simplement vous recommandons ce qui suit dans mon équipe: il suffit de faire chaque méthode virtuelle par défaut, y compris le destructeur, dans chaque classe, et supprimer uniquement lorsque vous en avez besoin pour. Est-ce que sembler fou pour vous?

  • Voir aussi le Dépassement de Pile question: l'IA des Applications en C++: Comment coûteuses sont des fonctions virtuelles? Quelles sont les optimisations possibles?
  • La comparaison virtuelle et non les appels virtuels n'est pas menaingfull. Ils offrent des fonctionnalités différentes. Si vous voulez comparer la fonction virtuelle appels contre les C equivelent vous devez ajouter le coût du code qui implémente la fonctionnalité équivalent de la fonction virtuelle.
  • Qui est soit une instruction switch ou un grand si l'instruction. Si vous étiez intelligent, vous pourriez re-mettre en œuvre à l'aide d'un pointeur de fonction table, mais les probabilités de se tromper sont beaucoup plus élevés.
  • Voir stackoverflow.com/questions/156257/...
  • La question est au sujet de la fonction des appels qui n'ont pas besoin d'être virtuel, de sorte que la comparaison est pertinente.
  • Rançon: oui, exactement, thx. Je suis à peu près en disant: "que faire si nous avons défini TOUTES les fonctions virtuelles, même ceux qui n'ont pas vraiment besoin de l'être, et, plus tard, de supprimer le mot clé virtual quand il est sûr à 100% qu'il n'est pas nécessaire". En procédant ainsi, aurions-nous éviter un tas de bugs et de perdre uniquement négligeable perf?
  • Si vous utilisez Visual C++, envisager l'utilisation de "substitution" qui est un non-standard: msdn.microsoft.com/en-us/library/z8ew2153.aspx. C'est très bon pour la détection de ces sortes de bugs au moment de la compilation.
  • double possible de les Performances pour travailler avec des interfaces en C++?
  • Tout en faisant virtuel par défaut jusqu'à ce que quelqu'un justifie pourquoi il peut/doit être non-virtuel est un abominable politique, oui.
  • Connexes: dans ma réponse à stackoverflow.com/questions/46579750/..., j'ai montré un cas où le coût de boucler sur un vecteur de pointeurs de l'appel d'une méthode virtuelle est peut-être 24x plus lent que boucler sur un vecteur d'objets directement, où le compilateur peut auto-vectorisation de après l'in-lining, le non-appel de fonction virtuelle. Donc, si vous avez le choix entre le maintien de plusieurs contenants pour les différents types d'objets contre de garder un tableau de pointeurs sur des objets mélangés, de laisser le compilateur inline petites fonctions est très bon.

InformationsquelleAutor MiniQuark | 2009-03-20