Specifikace optimalizace kompilátoru pro projekty knihovny ATL
Ve výchozím nastavení generuje ATL Control Wizard nové třídy s makrem ATL_NO_VTABLE takto:
class ATL_NO_VTABLE CProjName
{
...
};
Knihovna ATL potom definuje _ATL_NO_VTABLE takto:
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
Pokud nedefinujete _ATL_DISABLE_NO_VTABLE, makro ATL_NO_VTABLE se rozšíří do declspec(novtable).Použití declspec(novtable)v deklaraci třídy zabrání inicializaci ukazatele vtable v konstruktoru a destruktoru třídy. Při sestavení projektu eliminuje propojovací program vtable a všechny funkce na které odkazuje vtable.
Použijte ATL_NO_VTABLE a následně declspec(novtable) pouze pro základní třídy, které nejsou přímo vytvořitelné. declspec(novtable) nelze použít s většinou odvozených tříd v projektu protože tyto třídy (obvykle CComObject, CComAggObject, nebo CComPolyObject) inicializují ukazatel vtable pro váš projekt.
Nelze volat virtuální funkce z konstruktoru objektu, který používá declspec(novtable). Je možné přesunout tyto volání do metody FinalConstruct.
Pokud si nejste jisti, zda byste měli použít modifikátor declspec(novtable), můžete odebrat makro ATL_NO_VTABLE z definice jakékoliv třídy, nebo jej můžete globálně zakázat zadáním
#define _ATL_DISABLE_NO_VTABLE
v souboru stdafx.H před zahrnutím ostatních souboru hlaviček knihovny ATL.
Viz také
Úkoly
Tvorba běžných projektů pomocí průvodců aplikací
Referenční dokumentace
Průvodce projektem knihovny ATL
Výchozí konfigurace projektu knihovny ATL