Maison  >  Article  >  développement back-end  >  Table de fonctions virtuelles C++ et implémentation polymorphe, comment éviter le gaspillage de mémoire

Table de fonctions virtuelles C++ et implémentation polymorphe, comment éviter le gaspillage de mémoire

WBOY
WBOYoriginal
2024-05-31 19:03:001088parcourir

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, comment éviter le gaspillage 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. ShapeCircleRectangle 都有自己的虚函数表。这会浪费内存空间,因为 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
  }
};

优化结果:

通过使用虚基类 ShapeBaseCircleRectangle 现在可以共享同一个虚函数表。这消除了 Shape

Après optimisation via les classes de base virtuelles : rrreee

Résultats de l'optimisation :

🎜🎜En utilisant les classes de base virtuelles ShapeBase, 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn