Avoir 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 que chaque instance aura un pointeur virtuel.
Le coût de la mémoire est donc assez clair. Le plus important est le coût de la mémoire sur les instances (surtout si les instances sont petites, par exemple si elles sont juste censées contenir un entier: dans ce cas, avoir un pointeur virtuel dans chaque instance peut doubler la taille des instances. l'espace mémoire utilisé par les tables virtuelles, je suppose qu'il est généralement négligeable par rapport à l'espace utilisé par le code de méthode réel.
Cela m'amène à ma question: y a-t-il un coût de performance mesurable (c'est-à-dire un impact sur la vitesse) pour rendre une méthode virtuelle? Il y aura une recherche dans la table virtuelle au moment de l'exécution, à chaque appel de méthode, donc s'il y a des appels très fréquents à cette méthode, et si cette méthode est très courte, alors il pourrait y avoir un impact mesurable sur les performances? Je suppose que cela dépend de la plate-forme, mais est-ce que quelqu'un a exécuté des benchmarks?
La raison pour laquelle je pose la question est que je suis tombé sur un bogue qui était dû à un programmeur oubliant 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 ajoutons- nous le mot-clé virtuel en cas de besoin au lieu de supprimer le mot-clé virtuel alors que nous sommes absolument sûrs qu'il n'est pas nécessaire? Si le coût des performances est faible, je pense que je recommanderai simplement ce qui suit à mon équipe: il suffit de rendre chaque méthode virtuelle par défaut, y compris le destructeur, dans chaque classe, et de ne la supprimer que lorsque vous en avez besoin. Cela vous semble-t-il fou?