Delen via


Compileroptimalisatie opgeven voor een ATL-project

Opmerking

De ATL (Active Template Library) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

Standaard genereert de wizard ATL-beheer nieuwe klassen met de macro ATL_NO_VTABLE als volgt:

class ATL_NO_VTABLE CProjName
{
...
};

ATL definieert vervolgens _ATL_NO_VTABLE als volgt:

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

Als u _ATL_DISABLE_NO_VTABLE niet definieert, wordt de ATL_NO_VTABLE macro uitgebreid naar declspec(novtable). Als u een klassedeclaratie gebruikt declspec(novtable), voorkomt u dat de vtable-aanwijzer wordt geïnitialiseerd in de klasseconstructor en destructor. Wanneer u uw project bouwt, elimineert de linker de vtable en alle functies waarnaar de vtable punten.

U moet ATL_NO_VTABLE en dus declspec(novtable)alleen basisklassen gebruiken die niet rechtstreeks kunnen worden creaeerbaar. U mag niet gebruiken declspec(novtable) met de meest afgeleide klasse in uw project, omdat deze klasse (meestal CComObject, CComAggObject of CComPolyObject) de vtable-aanwijzer voor uw project initialiseert.

U mag geen virtuele functies aanroepen vanuit de constructor van een object dat gebruikmaakt van declspec(novtable). U moet deze aanroepen verplaatsen naar de FinalConstruct-methode .

Als u niet zeker weet of u de declspec(novtable) wijzigingsfunctie moet gebruiken, kunt u de ATL_NO_VTABLE macro verwijderen uit elke klassedefinitie of u kunt deze globaal uitschakelen door deze op te geven

#define _ATL_DISABLE_NO_VTABLE

in pch.h (stdafx.h in Visual Studio 2017 en eerder), voordat alle andere ATL-headerbestanden worden opgenomen.

Zie ook

ATL-projectwizard
C++ project-typen in Visual Studio
Programmeren met ATL en C Run-Time Code
Basisprincipes van ATL COM-objecten
novtable
Standaard-ATL-projectconfiguraties