ATL プロジェクトのコンパイラ最適化の指定
ATL コントロール ウィザードは、既定では ATL_NO_VTABLE マクロを使用して新しいクラスを生成します。次に例を示します。
class ATL_NO_VTABLE CProjName
{
...
};
ATL は _ATL_NO_VTABLE を以下のように定義します。
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif
_ATL_DISABLE_NO_VTABLE を定義しない場合、ATL_NO_VTABLE マクロは declspec(novtable) に展開されます。 クラス宣言で declspec(novtable) を使用すると、クラスのコンストラクターやデストラクターで vtable ポインターが初期化されません。 プロジェクトのビルド時に、vtable および vtable が指すすべての関数はリンカーによって削除されます。
ATL_NO_VTABLE および declspec(novtable) は、直接作成できない基本クラスだけで使用します。 プロジェクトの最派生クラス (通常は CComObject、CComAggObject、または CComPolyObject) はプロジェクトの vtable ポインターを初期化するため、プロジェクトの最派生クラスでは declspec(novtable) を使用しないでください。
declspec(novtable) を使用するオブジェクトのコンストラクターからは、仮想関数を呼び出しません。 これらの呼び出しは、FinalConstruct メソッドに移動してください。
declspec(novtable) 修飾子を使用するかどうかを判断できない場合は、クラス定義から ATL_NO_VTABLE マクロを削除するか、またはほかのすべての ATL ヘッダー ファイルをインクルードする前に、stdafx.h で次のように指定してマクロをグローバルに無効にできます。
#define _ATL_DISABLE_NO_VTABLE