Компілятор оптимізації

ATL 2.1 оптимізовано для компілятора Visual C++ 5.0. Зокрема, ви повинні знати, що багато ATL класи були оголошені з у ATL_NO_VTABLE макросів:

клас ATL_&NO_VTABLE CComControl
{
 nbsp; ...
}

ATL визначає ATL_NO_VTABLE наступним чином:

#IFDEF _ATL_DISABLE_&NO_VTABLE
 nbsp; # визначити ATL_NO_VTABLE
# інше
   # визначити ATL_NO_VTABLE __declspec(novtable)
#endif

Якщо _ATL_DISABLE_NO_VTABLE не визначено, у ATL_NO_VTABLE макрос розширюється до declspec(novtable) . Коли declspec(novtable) використовується в класі декларації, він запобігає таблиці вказівник будучи ініціалізовано в класу в конструктор і деструктор. Компонувальник таким чином можна усунути Віртуальна таблиця і всі функції вказав на таблиці, умови, що більшість отриманих класу (зазвичай CComObject, CComAggObjectабо CComPolyObject) не підтримує declspec(novtable) і буде таким чином ініціалізувати вказівник таблиці правильно.

За промовчанням, майстер ATL об'єкт буде генерувати нові класи з у ATL_NO_VTABLE макрос. Як зазначалося вище, в declspec(novtable) атрибут використовується з базових класів, які не є безпосередньо creatable. Крім того, це небезпечне називати віртуальних функцій від конструктора будь-який об'єкт, що використовує declspec(novtable) . Вам слід рухатися такі дзвінки до методу FinalConstruct.

Якщо ви не впевнені, чи слід використовувати в declspec(novtable) атрибут, можна видалити в ATL_NO_VTABLE макрос з будь-якого класу визначення або ви глобально відключити його за допомогою визначення #define _ATL_DISABLE_NO_VTABLE в stdafx.h, перш ніж всі інші ATL заголовні файли додаються.

Index