Udostępnij za pośrednictwem


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