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

Vytváření projektů pomocí průvodců aplikace

Odkaz

Průvodce projektem knihovny ATL

Fundamentals of ATL COM Objects

novtable

Výchozí konfigurace projektu knihovny ATL

Koncepty

Projekty Visual C++

Programming with ATL and C Run-Time Code