Optymalizacja kompilatorów

ATL 2.1 Zoptymalizowano dla kompilatora Visual C++ 5.0. W szczególności, należy pamiętać, że wiele klas ATL są zadeklarowane z ATL_NO_VTABLE makro:

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

Definiuje ATL ATL_NO_VTABLE następująco:

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

Jeśli _ATL_DISABLE_NO_VTABLE nie jest zdefiniowana, ATL_NO_VTABLE makro jest rozszerzany, aby declspec(novtable) . Gdy declspec(novtable) jest używana w deklaracji klasy, zapobiega wskaźnik Tablica metod wirtualnych z jego zainicjowaniem w tej klasie konstruktora i destruktor. Konsolidator w ten sposób można wyeliminować Tablica metod wirtualnych i wszystkie funkcje wskazywanego przez Tablica metod wirtualnych, pod warunkiem pochodzi większość klasy (zazwyczaj CComObject, CComAggObjectlub CComPolyObject) nie korzysta z declspec(novtable) i będzie zatem zainicjować poprawnie wskaźnik Tablica metod wirtualnych.

Domyślnie kreator obiektu ATL będzie generować nowych klas z ATL_NO_VTABLE makro. Jak wcześniej wspomniano, declspec(novtable) atrybut powinna być stosowana tylko z klasy bazowej, które nie są bezpośrednio tworzyć. Ponadto konieczne jest niebezpieczne dla wywołania funkcji wirtualnych z konstruktora obiektu, który używa declspec(novtable) . Należy przenieść te wywołania metody FinalConstruct.

Jeśli użytkownik jest pewien, czy należy używać declspec(novtable) atrybut, można usunąć ATL_NO_VTABLE makra z każdej definicji klasy lub globalnie wyłącz ją określając #define _ATL_DISABLE_NO_VTABLE w stdafx.h, przed wszystkimi innymi ATL plików nagłówkowych zawarte są.

Index