novtable
Específicos de Microsoft
Este es un atributo extendido __declspec
.
Esta forma de __declspec
se puede aplicar a cualquier declaración de clase, pero solo se debe aplicar a clases de interfaz puras, es decir, clases que nunca crearán instancias por sí solas. El objeto __declspec
impide que el compilador genere código para inicializar vfptr en los constructores y el destructor de la clase. En muchos casos, esto quita las únicas referencias a la vtable asociadas a la clase y, en consecuencia, el vinculador la quita. El uso de esta forma de __declspec
puede producir una reducción significativa del tamaño del código.
Si intenta crear una instancia de una clase marcada con novtable
y, a continuación, tener acceso a un miembro de clase, recibirá una infracción de acceso (AV).
Ejemplo
// novtable.cpp
#include <stdio.h>
struct __declspec(novtable) X {
virtual void mf();
};
struct Y : public X {
void mf() {
printf_s("In Y\n");
}
};
int main() {
// X *pX = new X();
// pX->mf(); // Causes a runtime access violation.
Y *pY = new Y();
pY->mf();
}
In Y
FIN de Específicos de Microsoft