Les classes de base virtuelles optimisent la surcharge de mémoire des tables de fonctions virtuelles en permettant l'héritage de plusieurs classes de base sans créer de tables de fonctions virtuelles supplémentaires. Dans le code optimisé, la classe de base de forme n'a plus de table de fonctions virtuelles et les classes cercle et rectangle partagent la même table de fonctions virtuelles, réduisant ainsi la consommation de mémoire.
Table de fonctions virtuelles C++ et implémentation polymorphe : éviter le gaspillage de mémoire
Introduction
Le polymorphisme est une fonctionnalité clé de la programmation orientée objet qui permet aux objets de présenter différents comportements en fonction de la situation et de leur type. . En C++, le polymorphisme est implémenté via des tables de fonctions virtuelles. Cependant, les tables virtuelles peuvent entraîner un gaspillage de mémoire, surtout s'il existe un grand nombre d'objets.
Table de fonctions virtuelles
Une table de fonctions virtuelles est une table qui contient des pointeurs vers des fonctions virtuelles. Lorsqu'une fonction virtuelle est appelée, le compilateur utilise la table de fonctions virtuelles pour trouver l'implémentation correcte de la fonction. Cela garantit que l'objet peut appeler les fonctions correctes définies pour son type.
Gaspillage de mémoire
La table de fonctions virtuelles occupe de l'espace mémoire. Pour chaque classe, une table virtuelle est créée, même s'il n'y a aucune fonction virtuelle dans la classe. Pour les applications comportant un grand nombre d’objets, cela peut entraîner une surcharge de mémoire importante.
Optimisation : utilisez des classes de base virtuelles
Une façon d'éviter le gaspillage de mémoire dans les tables de fonctions virtuelles consiste à utiliser des classes de base virtuelles. Les classes de base virtuelles permettent l'héritage de plusieurs classes de base sans créer de tables de fonctions virtuelles supplémentaires.
Cas pratique
Considérez la hiérarchie de classes suivante :
class Shape { public: virtual void draw() = 0; }; class Circle : public Shape { public: void draw() override { // Draw a circle } }; class Rectangle : public Shape { public: void draw() override { // Draw a rectangle } };
Avant l'optimisation :
Dans l'implémentation ci-dessus, Shape
, Circle
et Rectangle
possède sa propre table de fonctions virtuelles. Cela gaspille de l'espace mémoire car Shape
n'a pas de fonctions virtuelles. Shape
、Circle
和 Rectangle
都有自己的虚函数表。这会浪费内存空间,因为 Shape
没有虚函数。
优化后通过虚基类:
class ShapeBase { public: virtual void draw() = 0; }; class Shape : public ShapeBase { }; class Circle : public Shape { public: void draw() override { // Draw a circle } }; class Rectangle : public Shape { public: void draw() override { // Draw a rectangle } };
优化结果:
通过使用虚基类 ShapeBase
,Circle
和 Rectangle
现在可以共享同一个虚函数表。这消除了 Shape
Après optimisation via les classes de base virtuelles : rrreee
Résultats de l'optimisation :
🎜🎜En utilisant les classes de base virtuellesShapeBase
, Circle
et Rectangle code> code> peut désormais partager la même table virtuelle. Cela élimine la table virtuelle du <code>Shape
, réduisant ainsi la surcharge de mémoire. 🎜🎜🎜Conclusion🎜🎜🎜En utilisant des classes de base virtuelles, vous pouvez éviter le gaspillage de mémoire causé par la table de fonctions virtuelles en C++. Cela peut améliorer l’efficacité de la mémoire, en particulier dans les applications comportant un grand nombre d’objets. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!