Compileroptimierung

ATL 2.1 wurde für den Compiler Visual C++ 5.0 optimiert. Insbesondere sollte man sich bewusst, dass viele ATL-Klassen mit deklariert sind die ATL_NO_VTABLE Makro:

class ATL_&NO_VTABLE CComControl
{
 Nbsp; ...
}

ATL definiert ATL_NO_VTABLE wie folgt:

# ifdef _ATL_DISABLE_&NO_VTABLE
 Nbsp; # define ATL_NO_VTABLE
# else
   # define ATL_NO_VTABLE __declspec(novtable)
# endif

Wenn _ATL_DISABLE_NO_VTABLE nicht definiert ist, die ATL_NO_VTABLE Makro erweitert zu declspec(novtable) . Beim declspec(novtable) wird in einer Klassendeklaration, es verhindert, dass den Vtable-Zeiger in der Klasse Konstruktor und Destruktor initialisiert wird. Der Linker kann somit beseitigen die Vtable und alle Funktionen verweist die Vtable, vorausgesetzt, die am meisten abgeleiteten Klasse (normalerweise CComObject, CComAggObjectoder CComPolyObject) nicht verwendet declspec(novtable) und wird somit den Vtable-Zeiger korrekt initialisieren.

Standardmäßig generiert der ATL-Objekt-Assistenten neue Klassen mit dem ATL_NO_VTABLE Makro. Wie zuvor beschrieben, die declspec(novtable) Attribut sollte nur verwendet werden, mit Basisklassen, die nicht direkt erstellbar sind. Weiter, es ist unsicher, virtuelle Funktionen aus der Konstruktor eines Objekts aufgerufen werden, die verwendet declspec(novtable) . Sie sollten diese Aufrufe in die FinalConstruct -Methode verschieben.

Wenn Sie unsicher sind, ob Sie verwenden sollten das declspec(novtable) -Attribut können Sie die ATL_NO_VTABLE Makro aus jede Klassendefinition oder Sie global deaktivieren, indem Sie #define _ATL_DISABLE_NO_VTABLE in der Datei stdafx.h, vor allen anderen ATL-Headerdateien sind enthalten.

Index