Partager via


Spécification de l’optimisation du compilateur pour un projet ATL

Par défaut, l’Assistant Contrôle ATL génère de nouvelles classes avec la macro ATL_NO_VTABLE, comme suit :

class ATL_NO_VTABLE CProjName
{
...
};

ATL définit ensuite _ATL_NO_VTABLE comme suit :

#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif

Si vous ne définissez pas _ATL_DISABLE_NO_VTABLE, la macro ATL_NO_VTABLE s’étend sur declspec(novtable). L’utilisation declspec(novtable)dans une déclaration de classe empêche l’initialisation du pointeur vtable dans le constructeur de classe et le destructeur. Lorsque vous générez votre projet, l’éditeur de liens élimine la table virtuelle et toutes les fonctions auxquelles pointe la table virtuelle.

Vous devez utiliser ATL_NO_VTABLE, et par conséquent declspec(novtable), avec uniquement les classes de base qui ne sont pas directement créatables. Vous ne devez pas utiliser declspec(novtable) avec la classe la plus dérivée de votre projet, car cette classe (généralement CComObject, CComAggObject ou CComPolyObject) initialise le pointeur de table virtuelle pour votre projet.

Vous ne devez pas appeler de fonctions virtuelles à partir du constructeur d’un objet qui utilise declspec(novtable). Vous devez déplacer ces appels vers la méthode FinalConstruct .

Si vous ne savez pas si vous devez utiliser le declspec(novtable) modificateur, vous pouvez supprimer la macro ATL_NO_VTABLE de n’importe quelle définition de classe, ou vous pouvez la désactiver globalement en spécifiant

#define _ATL_DISABLE_NO_VTABLE

dans pch.h (stdafx.h dans Visual Studio 2017 et versions antérieures), avant que tous les autres fichiers d’en-tête ATL soient inclus.

Voir aussi

Assistant Projet ATL
Types de projets C++ dans Visual Studio
Programmation avec ATL et le code C Run-Time
Principes de base des objets ATL COM
novtable
Configurations de projet ATL par défaut