Sdílet prostřednictvím


Zadání optimalizace kompilátoru pro projekty ATL

Průvodce ovládacími prvky ATL ve výchozím nastavení generuje nové třídy pomocí makra ATL_NO_VTABLE následujícím způsobem:

class ATL_NO_VTABLE CProjName
{
...
};

ATL pak definuje _ATL_NO_VTABLE následujícím způsobem:

#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif

Pokud nedefinujete _ATL_DISABLE_NO_VTABLE, rozbalí se makro ATL_NO_VTABLE na declspec(novtable). Použití declspec(novtable)v deklaraci třídy zabraňuje inicializaci ukazatele vtable v konstruktoru třídy a destruktoru. Když sestavíte projekt, linker eliminuje virtuální tabulku a všechny funkce, na které tabulka odkazuje.

Je nutné použít ATL_NO_VTABLE a v důsledku toho declspec(novtable), pouze se základními třídami, které nejsou přímo creatable. Nesmíte použít declspec(novtable) s nejvíce odvozenou třídou v projektu, protože tato třída (obvykle CComObject, CComAggObject nebo CComPolyObject) inicializuje ukazatel vtable pro váš projekt.

Nelze volat virtuální funkce z konstruktoru jakéhokoli objektu, který používá declspec(novtable). Tato volání byste měli přesunout do metody FinalConstruct .

Pokud si nejste jistí, jestli byste měli použít declspec(novtable) modifikátor, můžete odebrat ATL_NO_VTABLE makro z jakékoli definice třídy nebo ho můžete globálně zakázat zadáním

#define _ATL_DISABLE_NO_VTABLE

in pch.h (stdafx.h v sadě Visual Studio 2017 a starší) před zahrnutím všech ostatních souborů hlaviček ATL.

Viz také

Průvodce projektem ATL
Typy projektů C++ v sadě Visual Studio
Programování s použitím knihovny ATL a běhového kódu jazyka C
Základy ATL – objekty COM
novtable
Výchozí konfigurace projektu ATL