Condividi tramite


Impostazione dell'ottimizzazione del compilatore per un progetto ATL

Per impostazione predefinita, la Creazione guidata controllo ATL genera nuove classi con la macro ATL_NO_VTABLE, come riportato di seguito:

class ATL_NO_VTABLE CProjName
{
   ...
};

Viene quindi definita la macro _ATL_NO_VTABLE nel seguente modo:

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

Se non si definisce _ATL_DISABLE_NO_VTABLE, la macro ATL_NO_VTABLE si espande come declspec(novtable). L'utilizzo di declspec(novtable)in una dichiarazione di classe impedisce quindi l'inizializzazione del puntatore vtable nel costruttore e nel distruttore della classe. Quando viene compilato il progetto, il linker elimina il puntatore vtable e tutte le funzioni a cui fa riferimento.

È necessario utilizzare ATL_NO_VTABLE e declspec(novtable) solo con le classi base non creabili direttamente. Il modificatore declspec(novtable) non deve invece essere utilizzato con la classe derivata di livello più basso del progetto, poiché questa (in genere CComObject, CComAggObject o CComPolyObject) inizializza il puntatore vtable per il progetto.

Le funzioni di tipo virtual non devono essere chiamate dal costruttore di un oggetto che utilizza declspec(novtable). È quindi opportuno spostare le chiamate al metodo FinalConstruct.

Se non si è certi dell'utilizzo del modificatore declspec(novtable), è possibile rimuovere la macro ATL_NO_VTABLE da qualsiasi definizione di classe oppure disabilitarla a livello globale specificando

#define _ATL_DISABLE_NO_VTABLE

in stdafx.h, prima di includere gli altri file di intestazione ATL.

Vedere anche

Attività

Creazione di progetti tramite le creazioni guidate applicazioni

Riferimenti

Creazione guidata progetto ATL

Fundamentals of ATL COM Objects

novtable

Configurazioni predefinite di progetti ATL

Concetti

Progetti di Visual C++

Programming with ATL and C Run-Time Code