57 votes

La finale est-elle utilisée pour l'optimisation en C ++?

 class A {
public:
    virtual void f() = 0;
};

class B : public A {
public:
    void f() final override { };
};

int main() {
    B* b = new B();
    b->f();
}
 

Dans ce cas, le compilateur est-il obligé de continuer la recherche de la table virtuelle pour b->f(); , ou peut-il appeler B::f() directement parce qu'il était marqué final ?

52voto

Niall Points 6133

Est final utilisé pour l'optimisation en C++?

Il peut être, et est.

Comme mentionné, il est déjà utilisé; voir ici et ici montrant le code généré pour le remplacer avec et sans final.

Une optimisation le long de ces lignes se rapportent à la "dé-virtualisation" de la les appels virtuels. Ce n'est pas toujours immédiatement affectés par l' final de la classe, ni de méthode. Mais ils offrent de l'aide pour déterminer cela, les règles normales de la les fonctions virtuelles et la hiérarchie de classes s'appliquent.

Si le compilateur peut déterminer que lors de l'exécution d'une méthode particulière qui sera toujours appelé (par exemple, compte tenu de l'OP exemple, avec un système automatique d'objet), on peut appliquer une optimisation de toute façon, indépendamment de savoir si la méthode est - final ou pas.

Optimisations relèvent de la comme-si la règle, qui permettent au compilateur de s'appliquer à toute transformation, aussi longtemps que le comportement observable est comme si le code d'origine avait été exécuté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X