web-dev-qa-db-fra.com

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 a été marqué final?

41
tmlen

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

Cela peut être et est.

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

ne optimisation dans ce sens concernerait la "dé-virtualisation" des appels virtuels. Ceci n'est pas toujours immédiatement affecté par le final de la classe ni de la méthode. Bien qu'ils offrent de l'aide pour le déterminer, les règles normales des fonctions virtuelles et de la hiérarchie des classes s'appliquent.

Si le compilateur peut déterminer qu'au moment de l'exécution une méthode particulière sera toujours appelée (par exemple, étant donné l'exemple OP, avec un objet automatique), il pourrait appliquer une telle ne optimisation de toute façon , indépendamment du fait que la méthode soit final ou non.

Les optimisations relèvent de la règle as-if , qui permet au compilateur d'appliquer n'importe quelle transformation tant que le comportement observable est aussi -si le code d'origine a été exécuté.

39
Niall