Compartilhar via


novtable

Específico da Microsoft

Esse é um atributo __declspec estendido.

Essa forma de __declspec pode ser aplicada a qualquer declaração de classe, mas só deve ser aplicada às classes puras da interface, ou seja, classes que nunca serão instanciadas por conta própria. __declspec impede que o compilador gere códigos para inicializar vfptr nos construtores e destruidores da classe. Em diversos casos, isso remove as únicas referências para vtable que estão associadas à classe. Portanto, o vinculador as removerá. Usar esta forma de __declspec pode resultar em uma redução significativa do tamanho do código.

Se você tentar instanciar uma classe marcada com novtable e, em seguida, acessar em um membro da classe, você receberá uma violação de acesso (AV).

Exemplo

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

Consulte também

Referência

__declspec

Palavras-chave C++