novtable
Seção específica da Microsoft
Esse é um atributo estendido __declspec
.
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 AV (violação de acesso).
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();
}
In Y
Fim da seção específica da Microsoft
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de