Flux rss
Collection CommentÇaMarche.net

[Optimisation] Polymorphisme “statique”

Bookmark Ajouter aux favoris / Partager
Dernière mise à jour le 21 septembre 2004 à 22:07 par tafiscobar
Publié par Fu Xuen
Le polymorphisme est l'une des pierres angulaires du paradigme objet :
- http://www.commentcamarche.net/poo/polymorp.php3

En C++, il s'exprime sous la forme de fonctions virtuelles : celles-ci permettent d'adapter dynamiquement (i.e. à l'exécution) leur code au type de l'objet auxquelles elles sont appliquées. Cela peut avoir un impact négatif sur les performances, dans le cas particulier où :
• le code à l'intérieur de ces fonctions est court ;
• ces fonctions sont appelées très souvent.

En effet, comme le compilateur ne connaît pas à l'avance le code à appliquer, il ne peut pas appliquer les optimisations usuelles. Par ailleurs, le coût en place mémoire est d'autant plus grand que les branchements possibles (pour chaque type d'objet) sont nombreux.

Il existe cependant une astuce, dûe à Barton et Nackman :
- http://accu.org/cgi-bin/accu/rvout.cgi?from=0au_b&file=s002007a

Elle consiste à déclarer la classe parente comme classe générique, recevant comme paramètre le type de la classe dérivée. Cette classe devra ensuite tout déléguer à ses héritiers (comme un classe abstraite qui n'a que des fonctions virtuelles pures), mais ainsi le code à appliquer est connu au moment de la compilation.

Voici un petit exemple :
// classe de base paramétrée par le type de la classe dérivée
template<class TypeEnfant>
class Matrice {
public:
  // fonction de délégation
  TypeEnfant& CommeUnEnfant()
  {
    return (static_cast<TypeEnfant&>(*this));
  }

  // surcharge par délégation
  double operator()(int i, int j)
  {
    return (CommeUnEnfant()(i,j));
  }
private:
  ...
};

// exemples de classes dérivées
class MatriceTriangulaire : public Matrice<MatriceTriangulaire> {
private:
  ...
};

class MatriceSymetrique : public Matrice<MatriceSymetrique> {
private:
  ...
};

// fonction "virtuelle" fonctionnant avec n'importe quel type de matrice
template<class TypeEnfant>
double norme(Matrice<TypeEnfant>&);

// exemple d'application
double nt, ns;
MatriceTriangulaire mt;
MatriceSymetrique   ms;
nt = norme(mt);
ns = norme(ms);


N'empéche que ce n'est pas totalement souple, car tout ajout se fera dans la plupart des cas dans au moins deux endroits dans le code, dans l'interface de la classe dérivée et dans celle de la classe de base. Je préconise donc que cette méthode est à utiliser lorsque l'interface est figée et que comme le titre le dit, on veut optimiser le code.
POO - Le polymorphisme Définition du polymorphisme Le nom de polymorphisme vient du grec et signifie qui peut prendre plusieurs formes. Cette caractéristique est un des concepts essentiels de la programmation orientée objet. Alors que l'héritage concerne les classes (et... www.commentcamarche.net/contents/poo/polymorp.php3
Limiter les effets de l'électricité statique Se prémunir des effets néfastes de l'électricité statique Tous ceux qui possèdent une automobile en ont fait l'expérience un jour, plus souvent en hiver et par temps sec, cette petite décharge que l'on appréhende au moment de toucher une poignée de... www.commentcamarche.net/faq/sujet-12717-limiter-les-effets-de-l-electricite-statique
Le mot-clé static ou les attributs et méthodes de classe en POO (NOTE: Cet article explique la signification du mot-clé static au sein d'une classe. La signification de "static" en C n'a par exemple rien à voir.) Vous êtes débutant en programmation orientée objet. En Java, en C++...ou que sais-je encore.,... www.commentcamarche.net/faq/sujet-14564-le-mot-cle-static-ou-les-attributs-et-methodes-de-classe-en-poo
Liste station radio (Résolu)Bonjour Je voulais vous demander de m'aider à trouver un site où je pourrai trouver la liste des stations de radio telles que Fun radio, nrj... Merci www.commentcamarche.net/forum/affich-1671262-liste-station-radio
Statut "hors ligne" de msn (Résolu)Bonjour, Je voudrais savoir si il est possible de voir si un contact msn est en statut "apparaitre hors ligne". Merci www.commentcamarche.net/forum/affich-1992966-statut-hors-ligne-de-msn
Analyse de donnees statistiques par SPSS (Résolu)Bonjour, Je dois utiliser spss pour analyser des donnees statistiques...mais je n'ai pas de connaissance de spss....quelqu'un peut bien m'aider svp ? comment puis je apprendre a l'utiliser? Merci www.commentcamarche.net/forum/affich-5907120-analyse-de-donnees-statistiques-par-spss