Добавил к нему и еще к паре аналогичных мелких абстрактных классов __declspec(novtable), бинарник (VS2019) уменьшился на килобайт.
Причем один из этих классов наследует t_err_records_r — добавляется еще один абстрактный виртуальный метод.
---
Еще вопросы по novtable. Возможны ли засады:
2. С виртуальными деструкторами novtable-классов?
3. С dynamic_cast-ом?
4. C абстрактным классом, экспортируемым DLL-ю?
На сколько я понимаю, в конструкторе/деструкторе novtable-класса не стоит:
— обращаться (напрямую/косвенно) к виртуальным методам
— юзать dynamic_cast к самому себе или родительским классам
и тогда проблем не будет.
Так что, в принципе, остается только первый вопрос только про оптимизатор. Или я его (оптимизатор) не правильно готовлю?
PS. C dynamic_cast я провел доп. эксперимент. Я его тут ниже, отдельно опубликую.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали: КД>Еще вопросы по novtable. Возможны ли засады: КД>2. С виртуальными деструкторами novtable-классов? КД>3. С dynamic_cast-ом?
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Если __declspec(novtable) реально уменьшает размер бинарников, то почему оптимизатор не юзает эту штуку по своему уразумению?
Интересно, а почему компилятор (VC) не позволяет запретить default-конструктор в классе с novtable и без каких-либо данных?
class __declspec(novtable) t_myclass
{
public:
t_myclass()=delete;
virtual void method()=0;
};
При компиляции конструктора производного класса вылазит ошибка.
Ответ я, собственно, знаю — потому что компилятор туповат.
Но есть сомнения — может это я хочу странного?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Еще вопросы по novtable. Возможны ли засады: КД>2. С виртуальными деструкторами novtable-классов? КД>3. С dynamic_cast-ом? КД>4. C абстрактным классом, экспортируемым DLL-ю?
Никаких засад не будет, если не создается объектов с таким статическим типом. Для этого достаточно просто следить, чтоб такие атрибуты пименялись только к абстрактным классам.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Интересно, а почему компилятор (VC) не позволяет запретить default-конструктор в классе с novtable и без каких-либо данных?
КД>
КД>При компиляции конструктора производного класса вылазит ошибка. КД>Ответ я, собственно, знаю — потому что компилятор туповат. КД>Но есть сомнения — может это я хочу странного?
Так novtable тут вообще ни при чем. Просто конструктор производного класса неявно использует конструктор по умолчанию базового класса, который у тебя запрещен. Чтобы избежать ошибки, нужно явно использовать какой-нибудь другой конструктор:
class __declspec(novtable) I
{
public:
I() = delete;
I(int) {}
virtual void foo() = 0;
};
class B : public I
{
public:
void foo() override {}
B() : I(42) {}
};
P.S. Если тебе нужно только защититься от создания объектов базового класса, просто сделай дефолтный конструктор защищенным. Хотя для абстрактных классов это излишняя мера, поскольку компилятор и так не позволит создать экземпляр абстрактного класса.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>Так novtable тут вообще ни при чем. Просто конструктор производного класса неявно использует конструктор по умолчанию базового класса, который у тебя запрещен. Чтобы избежать ошибки, нужно явно использовать какой-нибудь другой конструктор:
Это понятно.
Но я хотел описать чистый интерфейс (абстрактный класс с novtable), для которого компилятор не будет генерировать какие-либо методы.
Ни конструкторов, ни деструктора, ни операторов.
В общем — хочу "explicit class"
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Но я хотел описать чистый интерфейс (абстрактный класс с novtable), для которого компилятор не будет генерировать какие-либо методы. КД>Ни конструкторов, ни деструктора, ни операторов. КД>В общем — хочу "explicit class"
Ну это скорее похоже на интерфейсы C# и Java. Ну нету в C++ интефейсов, как таковых. Просто ни у кого нет достаточной мотивации, чтобы из вводить.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Добавил к нему и еще к паре аналогичных мелких абстрактных классов __declspec(novtable), бинарник (VS2019) уменьшился на килобайт.
Хм. У меня в последнем небольшом проекте только один абстрактный класс, бинарники (x86/x64) — 130/150 кб. Добавил novtable — оба уменьшились на три килобайта (VS 2008).
Я про давно novtable знал, но искренне полагал, что он ощутим только на наборах из десятков и более классов, а поди ж ты...