¿Se utiliza final para la optimización 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();
}

En este caso, ¿es necesario que el compilador siga haciendo la búsqueda de la tabla v para b->f();, o puede llamar a B::f() directamente porque estaba marcado final?

Author: Niall, 2016-05-24

1 answers

¿Se usa final para la optimización en C++?

Puede ser, y es.

Como se ha señalado, ya se está utilizando; ver aquí y aquí mostrando el código generado para la anulación con y sin final.

Una optimización en este sentido se relacionaría con la "des-virtualización" de las llamadas virtuales. Esto no siempre se ve inmediatamente afectado por el final de la clase nor método. Aunque ofrecen ayuda para determinar esto, el normal se aplican las reglas de las funciones virtuales y la jerarquía de clases.

Si el compilador puede determinar que en tiempo de ejecución siempre se llamará a un método en particular (por ejemplo, dado el ejemplo OP, con un objeto automático), podría aplicar una optimización de todos modos, independientemente de si el método es final o no.

Las optimizaciones caen bajo el como si la regla, que permiten al compilador aplicar cualquier transformación siempre y cuando el comportamiento observable sea el código original había sido ejecutado.

 26
Author: Niall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:19