Określanie optymalizacji kompilatora dla projektu ATL
Domyślnie Kreator kontrolek ATL generuje nowe klasy za pomocą makra ATL_NO_VTABLE w następujący sposób:
class ATL_NO_VTABLE CProjName
{
...
};
Następnie ATL definiuje _ATL_NO_VTABLE w następujący sposób:
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
Jeśli nie zdefiniujesz _ATL_DISABLE_NO_VTABLE, makro ATL_NO_VTABLE zostanie rozwinięte do declspec(novtable)
. Użycie declspec(novtable)
w deklaracji klasy uniemożliwia zainicjowanie wskaźnika vtable w konstruktorze klasy i destruktorze. Podczas kompilowania projektu konsolidator eliminuje tabelę wirtualną i wszystkie funkcje, do których wskazuje tabela wirtualna.
Należy użyć ATL_NO_VTABLE, a w związku z tym declspec(novtable)
tylko klas bazowych, które nie są bezpośrednio creatable. Nie można używać declspec(novtable)
z najbardziej pochodną klasą w projekcie, ponieważ ta klasa (zazwyczaj CComObject, CComAggObject lub CComPolyObject) inicjuje wskaźnik vtable dla projektu.
Nie można wywoływać funkcji wirtualnych z konstruktora dowolnego obiektu używającego metody declspec(novtable)
. Należy przenieść te wywołania do metody FinalConstruct .
Jeśli nie masz pewności, czy należy użyć declspec(novtable)
modyfikatora, możesz usunąć makro ATL_NO_VTABLE z dowolnej definicji klasy lub można ją globalnie wyłączyć, określając
#define _ATL_DISABLE_NO_VTABLE
w pliku pch.h (stdafx.h w programie Visual Studio 2017 lub starszym), zanim zostaną uwzględnione wszystkie inne pliki nagłówków ATL.
Zobacz też
Kreator projektu ATL
Typy projektów języka C++ w programie Visual Studio
Programowanie za pomocą kodu ATL i C Run-Time
Podstawowe informacje na temat obiektów COM ATL
novtable
Domyślne konfiguracje projektu ATL