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

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

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

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

чего-то я отупел, а какая «медленная» альтернатива?
с раскоменченной строкой, само собой, всё нормально...
Код
C++ (Qt)
#include <iostream>
class Base {
public:
       Base() {}
       virtual ~Base() = 0;
};
// inline ~Base() {}
 
class Derived: Base {
public:
       Derived() {};
       virtual ~Derived() {
               std::cout << "Derived::~Derived\n";
       }
};
 
int main() {
       Derived d;
       return 0;
}

Код:
alexander@goblin /tmp $ g++ 1.cpp
/tmp/cc3mCBWm.o: In function `Derived::~Derived()':
1.cpp:(.text._ZN7DerivedD2Ev[_ZN7DerivedD5Ev]+0x2f): undefined reference to `Base::~Base()'
1.cpp:(.text._ZN7DerivedD2Ev[_ZN7DerivedD5Ev]+0x58): undefined reference to `Base::~Base()'
collect2: выполнение ld завершилось с кодом возврата 1
ЗЫ: и что быстрее, компиляция или скорость выполнения?
Записан
OKTA
Гость
« Ответ #17 : Июнь 22, 2012, 16:17 »

Derived d();
Записан
alexis031182
Гость
« Ответ #18 : Июнь 22, 2012, 16:20 »

чего-то я отупел, а какая «медленная» альтернатива?
...
Код
C++ (Qt)
virtual ~Base() {}

ЗЫ: и что быстрее, компиляция или скорость выполнения?
Я так понимаю, что скорость выполнения. Если скорость компиляции, то не слишком интересно.
Записан
Fat-Zer
Гость
« Ответ #19 : Июнь 22, 2012, 16:51 »

Derived d();
мы же не функцию хотим объявить...

у меня показывает, что время примерно одинаково...
1.cpp
Код
C++ (Qt)
#include <iostream>
class Base {
public:
       Base() {}
       virtual ~Base() = 0;
};
 
inline Base::~Base() {}
 
class Derived: public Base {
public:
       Derived() {};
       virtual ~Derived() {}
};
 
int main() {
       int i=100500000;
       do {
               Derived d;
       } while(i--);
       return 0;
}
 
2.cpp
Код
C++ (Qt)
#include <iostream>
class Base {
public:
       Base() {}
       virtual ~Base() {}
};
 
class Derived: public Base {
public:
       Derived() {};
       void foo() {};
       virtual ~Derived() {}
};
 
int main() {
       int i=100500000;
       do {
               Derived d;
       } while(i--);
       return 0;
}
Код:
alexander@goblin /tmp $ g++ 1.cpp -O0 -o test1
alexander@goblin /tmp $ g++ 2.cpp -O0 -o test2
alexander@goblin /tmp $ time ./test1

real    0m22.259s
user    0m22.254s
sys     0m0.001s
alexander@goblin /tmp $ time ./test1

real    0m22.286s
user    0m22.280s
sys     0m0.001s
alexander@goblin /tmp $ time ./test2

real    0m22.312s
user    0m22.263s
sys     0m0.034s
alexander@goblin /tmp $ time ./test2

real    0m22.270s
user    0m22.264s
sys     0m0.001s
ЗЫ: спойлеров не хватает...
Записан
alexis031182
Гость
« Ответ #20 : Июнь 22, 2012, 16:59 »

Спасибо, Fat-Zer Улыбающийся

З.Ы. А всё-таки немножко жаль, что чуда нет
Записан
Bepec
Гость
« Ответ #21 : Июнь 22, 2012, 18:14 »

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

Компилятору начхать на эту строчку, его алгоритмы умнее нас с вами в области оптимизации inlin' ом Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


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

Логично, что в пределах 1го файла будет одинаковая скорость - он и так инлайнится.

Разница будет в том случае, если класс удаляется не по указателю на базовый (виртуальность не нужна - компилер и так знает, что надо вызвать), а деструктор расположен в другом модуле (и его нельзя заинлайнить, тк нечего).

Это предположение похоже на правду, но нужно протестить всё равно.
Записан
alexis031182
Гость
« Ответ #23 : Июнь 23, 2012, 15:56 »

Другими словами, если удалять через указатель на наследника?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #24 : Июнь 23, 2012, 16:35 »

Нет, если создавать объект на стеке. При удалении наследника компилер не может знать - финальный ли это наследник в цепочке, или нет.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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