Optimización del compilador

ATL 2.1 ha sido optimizado para el compilador de Visual C++ 5.0. En particular, debe tener en cuenta que muchas de las clases ATL se declaran con la ATL_NO_VTABLE macro:

clase CComControl de ATL_&NO_VTABLE
{
 nbsp; ...
}

ATL define ATL_NO_VTABLE como sigue:

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

Si _ATL_DISABLE_NO_VTABLE no está definido, la ATL_NO_VTABLE macro se expande a declspec(novtable) . Cuando declspec(novtable) se utiliza en una declaración de clase, impide el puntero vtable ser inicializado en el constructor y el destructor de la clase. El vinculador así puede eliminar la vtable y todas las funciones apuntado por la vtable, siempre que no utilice la clase derivada de la mayoría (normalmente CComObject, CComAggObjecto CComPolyObject) declspec(novtable) y por lo tanto se inicializará el puntero vtable correctamente.

De forma predeterminada, el Asistente para objetos ATL generará nuevas clases con el ATL_NO_VTABLE macro. Anteriormente descrito, el declspec(novtable) atributo sólo debe utilizarse con las clases base que no son directamente generables. Además, es inseguro para llamar a funciones virtuales desde el constructor de cualquier objeto que utiliza declspec(novtable) . Debe mover cualquier tales llamadas al método FinalConstruct.

Si no está seguro si debe utilizar el declspec(novtable) atributo, puede quitar el ATL_NO_VTABLE macro de cualquier definición de clase o desactivar globalmente especificando #define _ATL_DISABLE_NO_VTABLE en stdafx.h, antes todos otro ATL se incluyen archivos de encabezado.

Index