tiempo
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, ¿se requiere que el compilador aún realice la búsqueda en la tabla v para b->f();
o puede llamar B::f()
directamente porque estaba marcado final
?
Niall
¿Se usa final para la optimización en C++?
Puede ser, y es.
Como se señaló, ya se está utilizando; mira aquí y aquí mostrando el código generado para la anulación con y sin final
.
Una optimización en este sentido estaría relacionada con la “desvirtualización” de las llamadas virtuales. Esto no siempre se ve inmediatamente afectado por la final
de la clase ni del método. Aunque ofrecen ayuda para determinar esto, se aplican las reglas normales 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 tal optimización de todos modos, independientemente de si el método es final
O no.
Las optimizaciones caen bajo el regla como sique permiten al compilador aplicar cualquier transformación siempre que el comportamiento observable sea como si se hubiera ejecutado el código original.
-
Esta ha sido la respuesta durante mucho tiempo, pero ¿hay algún compilador /realmente/ usando final para la desvirtualización?
– Johan Lundberg
27 mayo 2016 a las 22:10
-
@JohanLundberg: Experimentación rápida con el Explorador del compilador y localmente muestra que al menos gcc 6.1, clang 3.8 y MSVC++2015U2 usan el
final
palabra clave para la desvirtualización.– usuario786653
28 de mayo de 2016 a las 7:32
-
Para cualquier persona curiosa, creo que aquí es donde ocurre actualmente esta optimización en clang: CodeGenFunction::CanDevirtualizeMemberFunctionCall
– usuario786653
28 mayo 2016 a las 20:59
-
@JohanJundberg Hay un excelente blog serio de uno de los desarrolladores de gcc sobre la desvirtualización: hubicka.blogspot.de/2014/01/desvirtualización-en-c-part-1.html. También contiene una explicación cuando final ayuda, y gcc introdujo una advertencia para los casos en los que se agrega
final
permitiría optimizaciones que no se pueden hacer de otra manera.– Jens
29 mayo 2016 a las 19:12
arreglado la pregunta
– tiempo
24 mayo 2016 a las 13:25
class C : pubic A { void f() override; };
– KerrekSB
24 mayo 2016 a las 13:25
new A()
está mal formado, porqueA
es abstracto– KerrekSB
24 mayo 2016 a las 13:26
Mirar desvirtualización.
– Jarod42
24 mayo 2016 a las 13:26
Por cierto, la optimización no es requerida por el estándar. Existe la regla como-si que permite la optimización.
– Jarod42
24 de mayo de 2016 a las 13:29