Название: [РЕШЕНО] Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: alexis031182 от Июнь 21, 2012, 20:13 Предположим, есть классы:
Код В Интернете, находясь в поиске решения очередной задачи, не раз замечал предложения виртуальный деструктор базового класса делать чисто виртуальным. Но нет, я не про тот случай, когда указанный метод применяют для превращения класса в абстрактный при отсутствии других виртуальных методов. Пишут, что работает быстрее следующее: Код Объясните, почему так? Понимаю, что разница в скорости если и есть, то не шибко большая. Но вопрос принципиален. Спасибо. Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: Alex Custov от Июнь 21, 2012, 21:07 быстрее настолько, насколько увеличится скорость за счёт inline, которого может и не быть по усмотрению компилятора. Короче, сомнительно. Единственное что я вижу - если в классе нет других чистых виртуальных методов, то запретить создавать объекты этого класса за счёт деструктора.
Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: alexis031182 от Июнь 21, 2012, 21:12 быстрее настолько, насколько увеличится скорость за счёт inline, которого может и не быть по усмотрению компилятора. Короче, сомнительно. Вот и я не понимаю, с чего это будет работать быстрее.Единственное что я вижу - если в классе нет других чистых виртуальных методов, то запретить создавать объекты этого класса за счёт деструктора. Это-то да, вполне себе обосновано. А первое - как-то совсем неочевидно.Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: Blackwanderer от Июнь 22, 2012, 10:43 Все методы, определённые внутри объявления класса по умолчанию считаются inline методами.
Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: Wlad_C от Июнь 22, 2012, 14:41 Цитировать Пишут, что работает быстрее ... Виртуальные методы выполняются медленней не виртуальных, т.к. обращение к ним происходит не напрямую а через таблицы, которые создает компилятор.Поэтому скорость здесь не причем (она будет медленней). А деструкторы должны быть виртуальными потому, что в спецификации С++ постулируется, что когда объект производного класса уничтожается через указатель на базовый класс с не виртуальным деструктором, то результат не определен. То есть, объекты принадлежащие производному классы могут быть не удалены. Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: mutineer от Июнь 22, 2012, 15:01 простите, а что значит "уничтожается через указатель на базовый класс"?? Код: Base *ptr = new Derived(); Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: alexis031182 от Июнь 22, 2012, 15:04 Мой вопрос несколько об ином. Из двух вариантов виртуальных деструкторов пишут, что один будет быстрее, другой медленнее. Почему? Есть ли вообще основания считать означенное утверждение верным? Вопрос именно в этом. Может оно конечно бабка надвое сказала, но тем не менее мне интересно.
Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: OKTA от Июнь 22, 2012, 15:14 я вот нашел седующее:
1. inline методы вставляются компилятором везде, где вызываются - соответственно скорость выше (но вставляются или нет - точно неизвестно, т.к. это рекомендации для компилятора) 2. если дектсруктор виртуальный, то при уничтожении класса вызовется его деструктор и деструктор базового класса, а если не виртуальный, то деструктор только базового класса! Соответственно выводы делаются! Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: alexis031182 от Июнь 22, 2012, 15:19 Повторюсь. Речь не о виртуальности, не инлайне как таковом, и не о правилах вызова деструкторов.
Вот нашёл одно из мест, где видел (http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.13) указанное в теме утверждение. Цитировать With functionoids, you first create a base class with a pure-virtual method: Код
Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: Igors от Июнь 22, 2012, 15:44 Конечно приятно позаниматься взвешиванием "на аптекарских весах", типа "оптимизация с до упора" - работа эксперта :) А соседняя строчка напр
Код Ой сколько экономий на деструкторе она перекроет! Но ей заниматься почему-то не хочется.. Нет вдохновения, да и вообще возиться с собственным строчником - фу, какая пошлость.. :) Название: Re: Виртуальный деструктор: чисто или не чист Отправлено: mutineer от Июнь 22, 2012, 15:47 Конечно приятно позаниматься взвешиванием "на аптекарских весах", типа "оптимизация с до упора" - работа эксперта :) А соседняя строчка напр Код Ой сколько экономий на деструкторе она перекроет! Но ей заниматься почему-то не хочется.. Нет вдохновения, да и вообще возиться с собственным строчником - фу, какая пошлость.. :) Так а каков ответ на вопрос "почему оно быстрее?" Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: OKTA от Июнь 22, 2012, 15:54 в ссылке тип написал, чтобы ему верили, что работает быстрее))) думаю по этой причине и быстрее))))
Название: Re: Виртуальный деструктор: чисто или не чист Отправлено: Blackwanderer от Июнь 22, 2012, 15:54 Так а каков ответ на вопрос "почему оно быстрее?" Да не будет оно быстрее!!! Нет, возможно когда-то давно, когда трава была зеленее, небо голубее, а программисты умнее компиляторов это все имело смысл, а сейчас... Сейчас две эти конструкции абсолютно эквивалентны.Название: Re: Виртуальный деструктор: чисто или не чист Отправлено: mutineer от Июнь 22, 2012, 15:57 Так а каков ответ на вопрос "почему оно быстрее?" Да не будет оно быстрее!!! Нет, возможно когда-то давно, когда трава была зеленее, небо голубее, а программисты умнее компиляторов это все имело смысл, а сейчас... Сейчас две эти конструкции абсолютно эквивалентны.Че так нервничать-то? Не быстрее, так не быстрее, это тоже ответ на вопрос:) Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: alexis031182 от Июнь 22, 2012, 16:02 Конечно приятно позаниматься взвешиванием "на аптекарских весах", типа "оптимизация с до упора" - работа эксперта :) Причём здесь это? Я и говорил, что "бабка надвое сказала". Просто непонятна мне эта конструкция. А поскольку автор написал "доверься мне", это сподвигло меня на создание темы в форуме :)А соседняя строчка напр И это тоже интересно :)Код Ой сколько экономий на деструкторе она перекроет! Но ей заниматься почему-то не хочется.. Нет вдохновения, да и вообще возиться с собственным строчником - фу, какая пошлость.. :) Название: Re: Виртуальный деструктор: чисто или не чист Отправлено: alexis031182 от Июнь 22, 2012, 16:04 Че так нервничать-то? Не быстрее, так не быстрее, это тоже ответ на вопрос:) ++Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: Fat-Zer от Июнь 22, 2012, 16:11 чего-то я отупел, а какая «медленная» альтернатива?
с раскоменченной строкой, само собой, всё нормально... Код
Код: alexander@goblin /tmp $ g++ 1.cpp Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: OKTA от Июнь 22, 2012, 16:17 Derived d();
Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: alexis031182 от Июнь 22, 2012, 16:20 чего-то я отупел, а какая «медленная» альтернатива? ... Код
ЗЫ: и что быстрее, компиляция или скорость выполнения? Я так понимаю, что скорость выполнения. Если скорость компиляции, то не слишком интересно.Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: Fat-Zer от Июнь 22, 2012, 16:51 Derived d(); мы же не функцию хотим объявить...у меня показывает, что время примерно одинаково... 1.cpp Код 2.cpp Код
Код: alexander@goblin /tmp $ g++ 1.cpp -O0 -o test1 Название: Re: Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: alexis031182 от Июнь 22, 2012, 16:59 Спасибо, Fat-Zer :)
З.Ы. А всё-таки немножко жаль, что чуда нет Название: Re: [РЕШЕНО] Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: Bepec от Июнь 22, 2012, 18:14 Да уже давно было сказано, что inline является лишь рекомендацией и в принципе не способен уже (на нынешний момент) влиять на скорость. ;)
Компилятору начхать на эту строчку, его алгоритмы умнее нас с вами в области оптимизации inlin' ом :) Название: Re: [РЕШЕНО] Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: Авварон от Июнь 23, 2012, 15:52 Логично, что в пределах 1го файла будет одинаковая скорость - он и так инлайнится.
Разница будет в том случае, если класс удаляется не по указателю на базовый (виртуальность не нужна - компилер и так знает, что надо вызвать), а деструктор расположен в другом модуле (и его нельзя заинлайнить, тк нечего). Это предположение похоже на правду, но нужно протестить всё равно. Название: Re: [РЕШЕНО] Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: alexis031182 от Июнь 23, 2012, 15:56 Другими словами, если удалять через указатель на наследника?
Название: Re: [РЕШЕНО] Виртуальный деструктор: чисто или не чисто, вот в чём вопрос Отправлено: Авварон от Июнь 23, 2012, 16:35 Нет, если создавать объект на стеке. При удалении наследника компилер не может знать - финальный ли это наследник в цепочке, или нет.
|