Поделиться через


Задание оптимизации компилятора для проекта 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 и все функции, на которые он указывает.

Необходимо использовать макрос ATL_NO_VTABLE и, следовательно, модификатор declspec(novtable) только с базовыми классами, которые нельзя создать напрямую. Нельзя использовать модификатор declspec(novtable) с производным классом, дальше всего отстоящим от базового в проекте, поскольку этот класс (обычно это CComObject, CComAggObject или CComPolyObject) инициализирует указатель vtable для проекта.

Нельзя вызывать виртуальные функции из конструктора любого объекта, использующего модификатор declspec(novtable). Необходимо перемещать эти вызовы в метод FinalConstruct.

Если точно неизвестно, должен ли использоваться модификатор declspec(novtable), то можно удалить макрос ATL_NO_VTABLE из определений всех классов, или отключить его глобально, указав:

#define _ATL_DISABLE_NO_VTABLE

В файле stdafx.h, перед включением всех других файлов заголовков ATL.

См. также

Задачи

Создание проектов с помощью мастеров приложений

Ссылки

мастер проектов ATL

Fundamentals of ATL COM Objects

novtable

Конфигурации по умолчанию проекта ATL

Основные понятия

Проекты Visual C++

Programming with ATL and C Run-Time Code