• [^] # Re: POO ?

    Posté par . En réponse à la dépêche Debian GNU/Hurd G1. Évalué à 1.

    L'utilisation des pointeurs de fonctions est nécessaire pour émuler les méthodes "virtuelles" du C++. Les compilo C++ en utilisent aussi. Sinon, comment fait-il lorsqu'il ne peut pas connaitre le type à l'exécution?

    Si je définis une méthode foo virtuelle dans la classe a, et deux méthodes réelles différentes dans les classes b et c (héritant toutes les deux de a) et une fonction du type:

    void bar(class_a *a)
    {
    a->foo();
    }

    Le compilo est bien obligé d'avoir des pointers de fonctions pour savoir quelle méthode appeler.

    Il y a aussi une autre solution (utilisée dans GObject je crois) qui consiste a avoir une structure 'classe' contenant les pointeurs de fonctions, de l'instancier une fois lors de la création du premier objet d'un type donné. On a ainsi un pointeur vers la classe (donc 4 octets) par objet et non par coupe (méthode, objet).

    Cependant, il faut voir que le principal problème des pointeurs de fonctions n'est pas les 4 octets de mémoire, mais le coût CPU. En effet, pour la plupart des processeurs, un 'indirect call' (appel à un pointeur de fonction) est beaucoup plus lent qu'un 'call' avec une adresse constant.