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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour