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 indicato di seguito:

class ATL_NO_VTABLE CProjName
{
...
};

ATL definisce quindi _ATL_NO_VTABLE come segue:

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

Se non si definiscono _ATL_DISABLE_NO_VTABLE, la macro ATL_NO_VTABLE si espande fino a declspec(novtable). L'uso declspec(novtable)di in una dichiarazione di classe impedisce l'inizializzazione del puntatore della tabella virtuale nel costruttore e nel distruttore della classe. Quando si compila il progetto, il linker elimina la tabella virtuale e tutte le funzioni a cui punta la tabella virtuale.

È necessario usare ATL_NO_VTABLE e di conseguenza declspec(novtable), con solo le classi di base che non sono direttamente creabili. Non è necessario usare declspec(novtable) con la classe più derivata nel progetto, perché questa classe (in genere CComObject, CComAggObject o CComPolyObject) inizializza il puntatore vtable per il progetto.

Non è necessario chiamare funzioni virtuali dal costruttore di qualsiasi oggetto che usa declspec(novtable). È consigliabile spostare tali chiamate al metodo FinalConstruct .

Se non si è certi che sia necessario usare il declspec(novtable) modificatore, è possibile rimuovere la macro ATL_NO_VTABLE da qualsiasi definizione di classe oppure disabilitarla a livello globale specificando

#define _ATL_DISABLE_NO_VTABLE

in pch.h (stdafx.h in Visual Studio 2017 e versioni precedenti), prima che vengano inclusi tutti gli altri file di intestazione ATL.

Vedi anche

Creazione guidata progetto ATL
Tipi di progetto C++ in Visual Studio
Programmazione con il codice runtime C e ATL
Nozioni fondamentali sugli oggetti COM ATL
novtable
Configurazioni progetto ATL predefinite