Sdílet prostřednictvím


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

Základy objektů COM ATL

novtable

Výchozí konfigurace projektu knihovny ATL

Koncepty

Typy projektů Visual C++

Programování s ATL a c kód