Freigeben über


novtable

Microsoft-spezifisch

Dies ist ein erweitertes __declspec-Attribut.

Diese Form von __declspec kann auf eine beliebige Klassendeklaration angewendet werden. Sie sollte jedoch nur auf reine Schnittstellenklassen angewendet werden, d. h. auf Klassen, die nie separat instanziiert werden. Mit dem __declspec-Attribut wird die Codegenerierung des Compilers gestoppt, um "vfptr" im Konstruktor/in den Konstruktoren und dem Destruktor der Klasse zu initialisieren. In vielen Fällen werden hierdurch die einzigen Verweise auf "vtable" entfernt, die der Klasse zugeordnet sind, sodass der Linker diese entfernt. Mit dieser Form des __declspec-Attributs kann eine erhebliche Verringerung der Codegröße erreicht werden.

Wenn Sie versuchen, eine Klasse zu instanziieren, die mit novtable gekennzeichnet ist, und dann auf einen Klassenmember zugreifen, tritt eine Zugriffsverletzung (AV) auf.

Beispiel

// 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();
}
  

Siehe auch

Referenz

__declspec

C++-Schlüsselwörter