Любитель чаепитий
|
|||||||||||
1 | |||||||||||
Безопасен ли static_cast для полиморфных классов?25.04.2017, 17:32. Показов 938. Ответов 4
Метки нет (Все метки)
добрый день.
проблема возникла из ниоткуда, по сути. просто в одном проекте используется boost.variant , для каста, соответственно, boost::get , но суть в том, что каждый экземпляр класса содержит тег, по которому можно определить тип variant 'a.то есть как-то так: Кликните здесь для просмотра всего текста
я подумал-подумал и понял, что в каком-то там варианте нет смысла, можно воспользоваться полиморфизмом и static_cast 'ом и жить спокойно, сделал прототип и думаю его протолкнуть.вопрос вообще в том, будет ли это быстрее? в реализации boost.variant нашёл std::addressof , что означает, что какая-то часть вычислений перенесена в рантайм. плюс там кидается экзепшон в boost::get , ну и проверки происходят всякие, медленно(я думаю), в общем.прототип: Кликните здесь для просмотра всего текста
что думаете, какие у этого есть недостатки/достоинства? может быть я где-то пропустил UB?
0
|
25.04.2017, 17:32 | |
Ответы с готовыми решениями:
4
Операция приведение типов для полиморфных классов Разработка полиморфных классов для обработки банковских счетов Shared_ptr для полиморфных объектов Даёт ли вендор гарантию на разгон? Безопасен ли разгон при применении фирменной утилиты для разгона? |
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
25.04.2017, 17:51 | 2 |
Я не думаю, что будет особая разница между обращением к таблице виртуальных функций или к вручную созданной переменной. Могу посоветовать вручную протестировать оба способа и посмотреть, что же там в ассемблере получается...
Добавлено через 6 минут UPD: dynamic_cast будет дороже, что-то VS2017 не особо умеет его оптимизировать.
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
25.04.2017, 18:04 | 3 |
Какое-то сплошное извращение. Но, будем считать, что так надо.
В теории, static_cast должен быть быстрее, т.к. Boost.Variant использует RTTI, а это дороговато. В любом случае, нужны тесты, конкретные цифры скажут больше, чем "а вот я думаю".
0
|
Любитель чаепитий
|
|
25.04.2017, 19:53 [ТС] | 4 |
извращение-то извращение, но скорость очень важна, в данном случае.
что-то поискал бенчмарки, но там то variant побеждает, то полиморфизм.и в каком случае будет обращение к vtable ? завтра свой бенчмарк напишу, короче.
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
25.04.2017, 20:35 | 5 |
Конечно все зависит от реализации, но зачастую
dynamic_cast работает через обращение к vtable . Например, при использовании dynamic_cast компилятор требует наличия виртуальных функций, нет функций - нет таблицы виртуальных функций.Ну и как видно из результатов моего компилятора, dynamic_cast преобразуется в вызов какой-то функции, когда как static_cast - в копирование указателя со смещением.Так что static_cast получше будет.
0
|
25.04.2017, 20:35 | |
25.04.2017, 20:35 | |
Помогаю со студенческими работами здесь
5
Программирование полиморфных методов динамическое приведение полиморфных объектов Безопасен ли 4G Модем? Безопасен ли Edge? Как правильно использовать operator= при наследовании в полиморфных и неполиморфных классах Насколько безопасен WebMoney Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |