novtable

Section spécifique à Microsoft

Il s’agit d’un __declspec attribut étendu.

Cette forme peut __declspec être appliquée à n’importe quelle déclaration de classe, mais ne doit être appliquée qu’à des classes d’interface pures, autrement dit, des classes qui ne seront jamais instanciées par elles-mêmes. Le __declspec compilateur empêche le compilateur de générer du code pour initialiser le vfptr dans le ou les constructeurs et le destructeur de la classe. Dans de nombreux cas, cela supprime les seules références à la vtable qui sont associés à la classe et, par conséquent, l'éditeur de liens supprimera cette vtable. L’utilisation de __declspec cette forme peut entraîner une réduction significative de la taille du code.

Si vous tentez d’instancier une classe marquée avec novtable et d’accéder à un membre de classe, vous recevrez une violation d’accès (AV).

Exemple

// 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 la section spécifique à Microsoft

Voir aussi

__declspec
Mots clés