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


Задание оптимизации компилятора для проекта 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++

Программирование с использованием ATL и кода среды выполнения C

Другие ресурсы

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