Ottimizzazione del compilatore

ATL 2.1 è stato ottimizzato per il compilatore Visual C++ 5.0. In particolare, è necessario essere consapevoli che molte classi ATL vengono dichiarate con la ATL_NO_VTABLE macro:

classe ATL_&NO_VTABLE CComControl
{
 nbsp; ...
}

ATL definisce ATL_NO_VTABLE come segue:

# ifdef _ATL_DISABLE_&NO_VTABLE
 nbsp; # define ATL_NO_VTABLE
# else
   # define __declspec(novtable) ATL_NO_VTABLE
# endif

Se _ATL_DISABLE_NO_VTABLE non è definito, la ATL_NO_VTABLE macro si espande a declspec(novtable) . Quando declspec(novtable) viene utilizzato in una dichiarazione di classe, impedisce il puntatore vtable nel costruttore della classe e il distruttore. Il linker può quindi eliminare vtable e tutte le funzioni a cui punta vtable, purché non utilizza la classe più derivata (genere CComObject, CComAggObjecto CComPolyObject) declspec(novtable) e quindi verrà inizializzato il puntatore vtable correttamente.

Per impostazione predefinita, la creazione guidata oggetto genera nuove classi con la ATL_NO_VTABLE macro. Come descritto in precedenza, il declspec(novtable) attributo dovrebbe essere utilizzato solo con classi di base che non sono direttamente creabile. Inoltre, è pericoloso per chiamare le funzioni virtuali dal costruttore di qualsiasi oggetto che utilizza declspec(novtable) . È quindi opportuno spostare qualsiasi tali chiamate al metodo FinalConstruct.

Se siete incerti se deve utilizzare il declspec(novtable) attributo, è possibile rimuovere il ATL_NO_VTABLE macro da qualsiasi definizione di classe oppure disabilitare globalmente specificando #define _ATL_DISABLE_NO_VTABLE in stdafx, prima di tutti gli altri ATL file di intestazione sono inclusi.

Index