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