Russian Qt Forum
Ноябрь 23, 2024, 23:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Виртуальный деструктор: чисто или не чисто, вот в чём вопрос  (Прочитано 12519 раз)
alexis031182
Гость
« : Июнь 21, 2012, 20:13 »

Предположим, есть классы:
Код
C++ (Qt)
class Base {
  Base() {}
  virtual ~Base() {}
};
 
class A : public Base {};
class B : public Base {};
//... и т.д.
 
В Интернете, находясь в поиске решения очередной задачи, не раз замечал предложения виртуальный деструктор базового класса делать чисто виртуальным. Но нет, я не про тот случай, когда указанный метод применяют для превращения класса в абстрактный при отсутствии других виртуальных методов. Пишут, что работает быстрее следующее:
Код
C++ (Qt)
class Base {
  Base() {}
  virtual ~Base() = 0;
};
 
inline Base::~Base() {}
 
Объясните, почему так? Понимаю, что разница в скорости если и есть, то не шибко большая. Но вопрос принципиален. Спасибо.
« Последнее редактирование: Июнь 22, 2012, 17:00 от alexis031182 » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Июнь 21, 2012, 21:07 »

быстрее настолько, насколько увеличится скорость за счёт inline, которого может и не быть по усмотрению компилятора. Короче, сомнительно. Единственное что я вижу - если в классе нет других чистых виртуальных методов, то запретить создавать объекты этого класса за счёт деструктора.
Записан
alexis031182
Гость
« Ответ #2 : Июнь 21, 2012, 21:12 »

быстрее настолько, насколько увеличится скорость за счёт inline, которого может и не быть по усмотрению компилятора. Короче, сомнительно.
Вот и я не понимаю, с чего это будет работать быстрее.

Единственное что я вижу - если в классе нет других чистых виртуальных методов, то запретить создавать объекты этого класса за счёт деструктора.
Это-то да, вполне себе обосновано. А первое - как-то совсем неочевидно.
Записан
Blackwanderer
Гость
« Ответ #3 : Июнь 22, 2012, 10:43 »

Все методы, определённые внутри объявления класса по умолчанию считаются inline методами.
Записан
Wlad_C
Гость
« Ответ #4 : Июнь 22, 2012, 14:41 »

Цитировать
Пишут, что работает быстрее ...
Виртуальные методы выполняются медленней не виртуальных, т.к. обращение к ним происходит не напрямую а через таблицы, которые создает компилятор.
Поэтому скорость здесь не причем (она будет медленней). А деструкторы должны быть виртуальными потому, что в спецификации С++ постулируется, что когда объект производного класса уничтожается через указатель на базовый класс с не виртуальным деструктором, то результат не определен. То есть, объекты принадлежащие производному классы могут быть не удалены.
Записан
mutineer
Гость
« Ответ #5 : Июнь 22, 2012, 15:01 »

простите, а что значит "уничтожается через указатель на базовый класс"??

Код:
Base *ptr = new Derived();
...
delete ptr;
Записан
alexis031182
Гость
« Ответ #6 : Июнь 22, 2012, 15:04 »

Мой вопрос несколько об ином. Из двух вариантов виртуальных деструкторов пишут, что один будет быстрее, другой медленнее. Почему? Есть ли вообще основания считать означенное утверждение верным? Вопрос именно в этом. Может оно конечно бабка надвое сказала, но тем не менее мне интересно.
Записан
OKTA
Гость
« Ответ #7 : Июнь 22, 2012, 15:14 »

я вот нашел седующее:
1. inline методы вставляются компилятором везде, где вызываются - соответственно скорость выше (но вставляются или нет - точно неизвестно, т.к. это рекомендации для компилятора)
2. если дектсруктор виртуальный, то при уничтожении класса вызовется его деструктор и деструктор базового класса, а если не виртуальный, то деструктор только базового класса!

Соответственно выводы делаются!
Записан
alexis031182
Гость
« Ответ #8 : Июнь 22, 2012, 15:19 »

Повторюсь. Речь не о виртуальности, не инлайне как таковом, и не о правилах вызова деструкторов.

Вот нашёл одно из мест, где видел указанное в теме утверждение.
Цитировать
With functionoids, you first create a base class with a pure-virtual method:
Код
C++ (Qt)
class Funct {
public:
  virtual int doit(int x) = 0;
  virtual ~Funct() = 0;
};
 
inline Funct::~Funct() {}  // defined even though it's pure virtual; it's faster this way; trust me
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июнь 22, 2012, 15:44 »

Конечно приятно позаниматься взвешиванием "на аптекарских весах", типа "оптимизация с до упора" - работа эксперта Улыбающийся А соседняя строчка напр
Код
C++ (Qt)
QString s("text");
 
Ой сколько экономий на деструкторе она перекроет! Но ей заниматься почему-то не хочется.. Нет вдохновения, да и вообще возиться с собственным строчником - фу, какая пошлость..  Улыбающийся

Записан
mutineer
Гость
« Ответ #10 : Июнь 22, 2012, 15:47 »

Конечно приятно позаниматься взвешиванием "на аптекарских весах", типа "оптимизация с до упора" - работа эксперта Улыбающийся А соседняя строчка напр
Код
C++ (Qt)
QString s("text");
 
Ой сколько экономий на деструкторе она перекроет! Но ей заниматься почему-то не хочется.. Нет вдохновения, да и вообще возиться с собственным строчником - фу, какая пошлость..  Улыбающийся

Так а каков ответ на вопрос "почему оно быстрее?"
Записан
OKTA
Гость
« Ответ #11 : Июнь 22, 2012, 15:54 »

в ссылке тип написал, чтобы ему верили, что работает быстрее))) думаю по этой причине и быстрее))))
Записан
Blackwanderer
Гость
« Ответ #12 : Июнь 22, 2012, 15:54 »

Так а каков ответ на вопрос "почему оно быстрее?"
Да не будет оно быстрее!!! Нет, возможно когда-то давно, когда трава была зеленее, небо голубее, а программисты умнее компиляторов это все имело смысл, а сейчас... Сейчас две эти конструкции абсолютно эквивалентны.
Записан
mutineer
Гость
« Ответ #13 : Июнь 22, 2012, 15:57 »

Так а каков ответ на вопрос "почему оно быстрее?"
Да не будет оно быстрее!!! Нет, возможно когда-то давно, когда трава была зеленее, небо голубее, а программисты умнее компиляторов это все имело смысл, а сейчас... Сейчас две эти конструкции абсолютно эквивалентны.

Че так нервничать-то? Не быстрее, так не быстрее, это тоже ответ на вопрос:)
Записан
alexis031182
Гость
« Ответ #14 : Июнь 22, 2012, 16:02 »

Конечно приятно позаниматься взвешиванием "на аптекарских весах", типа "оптимизация с до упора" - работа эксперта Улыбающийся
Причём здесь это? Я и говорил, что "бабка надвое сказала". Просто непонятна мне эта конструкция. А поскольку автор написал "доверься мне", это сподвигло меня на создание темы в форуме Улыбающийся

А соседняя строчка напр
Код
C++ (Qt)
QString s("text");
 
Ой сколько экономий на деструкторе она перекроет! Но ей заниматься почему-то не хочется.. Нет вдохновения, да и вообще возиться с собственным строчником - фу, какая пошлость..  Улыбающийся
И это тоже интересно Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.205 секунд. Запросов: 23.