Компилятор Microsoft позволяет добавить расширение «novtable» для атрибута «__declspec» при объявлении класса.
Заявленная цель — значительно уменьшить размер генерируемого кода. На экспериментах с нашими компонентами уменьшение составило от 0,6 до 1,2 процента от размера DLL.
Применимость: классы, не предназначенные для создания экземпляров напрямую из них.
Например: чисто интерфейсные классы.
В коде это выглядит так:
struct __declspec(novtable) IDrawable
{
virtual void Draw() const = 0;
};
Примечание: ключевое слово struct использовалось для декларации интерфейсного класса, чтобы избавить пример от не относящихся к теме статьи деталей; тогда как в случае использования class пришлось бы использовать public для указания «публичности» методов. По той же причине я не буду в этой статье добавлять виртуальный деструктор в интерфейсный класс.
Название «novtable» обещает, что виртуальной таблицы не будет… Но как же работает механизм вызова виртуальных функций в следующем коде:
// Добавим декларацию прямоугольника, реализующего интерфейс IDrawable:
class Rectangle : public IDrawable
{
virtual void Draw() const override
{
}
int width;
int height;
};
…
IDrawable* drawable = new Rectangle;
drawable->Draw(); // происходит вызов Rectangle::Draw
…
Читать полностью »