novtable

Microsoft-spezifisch

Dies ist ein __declspec erweitertes Attribut.

Diese Form kann __declspec auf jede Klassendeklaration angewendet werden, sollte jedoch nur auf reine Schnittstellenklassen angewendet werden, d. h. Klassen, die niemals eigenständig instanziiert werden. Der __declspec Compiler hindert den Compiler daran, Code zu generieren, um den Vfptr in den Konstruktoren und 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. Die Verwendung dieser Form __declspec kann zu einer erheblichen Verringerung der Codegröße führen.

Wenn Sie versuchen, eine Klasse zu instanziieren, die mit novtable einem Klassenmitglied gekennzeichnet ist, und dann auf ein Klassenmitglied zugreifen, erhalten Sie eine Zugriffsverletzung (AV).

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

Ende Microsoft-spezifisch

Siehe auch

__declspec
Schlüsselwörter