novtable
Sezione specifica Microsoft
Si tratta di un __declspec
attributo esteso.
Questa forma di può essere applicata a qualsiasi dichiarazione di __declspec
classe, ma deve essere applicata solo alle classi di interfaccia pure, ovvero alle classi che non verranno mai create autonomamente. __declspec
Impedisce al compilatore di generare codice per inizializzare la vfptr nei costruttori e nel distruttore della classe. In molti casi, in tal modo vengono rimossi gli unici riferimenti a vtable associati alla classe e, pertanto, il linker la rimuoverà. L'uso di questa forma di __declspec
può comportare una riduzione significativa delle dimensioni del codice.
Se si tenta di creare un'istanza di una classe contrassegnata con novtable
e quindi accedere a un membro della classe, si riceverà una violazione di accesso (AV).
Esempio
// 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
Fine sezione specifica Microsoft