На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (4) 1 [2] 3 4  все  ( Перейти к последнему сообщению )  
> насколько тормозной dynamic_cast?
    Цитата KILLER @
    Но у тебя я пока не вижу смысла делать виртуальное наследование. У тебя даже множественного наследования нет.

    Есть, множественное, в том числе ромбовидное.
    Но ты не мог его увидеть, поскольку я его не показывал.

    Добавлено
    Цитата KILLER @
    В Debug сборке? Я бы не стал там юзать static_cast, т.к. у тебя полиморфный тип. Попробуй компильнуть в Release режиме с полной оптимизацией и чуть усложни архитектуру, и вылетишь с каким нибудь AV.

    Угу. Сейчас именно debug сборка. А что и где может вылетить? Я не понял, в чём проблема?
    Сейчас компильнул, всё вроде ок... Правда у меня боевой нагрузки нет, только модульные тесты.

    Добавлено
    Цитата KILLER @
    Почему не круто? Идеальных архитектур не бывает, а dynamic_cast вполне себе безопасный вариант каста. Значит не так и плохо его юзать.

    Люди говорят, что не круто. А вот насколько это некруто, мне как раз, хотелось бы выяснить.
      Цитата Eric-S @
      А что и где может вылетить? Я не понял, в чём проблема?
      Сейчас компильнул, всё вроде ок... Правда у меня боевой нагрузки нет, только модульные тесты.

      Ну на сколько я понимаю, я могу конечно ошибаться, но все же. Когда ты юзаешь динамические полиморфные типы(классы с виртуальными функциями), то компилятор создает для каждого полиморфного объекта - VMT(Таблицу Виртуальных Методов). И эта таблица строиться как раз на основании архитектуры наследования, причем строится она конкретно в момент создания объекта динамически полиморфного типа, т.е. в рантайме, да еще и в куче, и именно ей пользуется dynamic_cast, для каста объектов разных типов. А static_cast - кастит/не кастит на этапе компиляции. Т.к. у тебя абстрактный класс, от которого наследуется дочерний, значит для них будет сгенерирована VMT. И я не думаю что static_cast вообще знает о ее существовании, т.к. он работает совершенно в другом измерении. Возможно в Debug сборке и при простой архитектуре, компилятор еще на этапе компиляции видит косяк, понимает что тут ошибка, и подменяет static_cast каким нибудь dynamic_cast, или просто срабатывает каст, как если бы у тебя не было виртуальных методов. Но мне кажется что при полной оптимизации и немного усложненной архитектуре, если не вылетит ошибка компиляции, то это еще не значит что static_cast будет работать всегда стабильно.

      Цитата Eric-S @
      Люди говорят, что не круто. А вот насколько это некруто, мне как раз, хотелось бы выяснить.

      А чем они аргументируют что это не круто? Если юзать dynamic_cast не круто, то динамический полиморфизм(то есть виртуальные методы) - тем более юзать не круто. Другими словами dynamic_cast юзать не круто, на столько же, на сколько не круто юзать динамический полиморфизм и RTTI. Так как ты получаешь некие преимущества гибкости при разработке программы, но жертвуешь памятью и скоростью.
      Потому как статический полиморфизм - работает на этапе компиляции - явный пример - Шаблоны. Все происходит на этапе компиляции, поэтому возрастает объем используемой памяти и падает производительность - только компиляции проекта, а на скорость выполнения программы - это никак не влияет. А вот динамический полиморфизм - работает только в рантайме! А соответственно он более тяжел, чем его брат статический полиморфизм. И памяти он больше жрет, и по скорости проседаешь.
      Соответственно - если ты выбрал использование динамического полиморфизма, значит использовать dynamic_cast - вполне нормально. И более того, это безопасно, т.к. можно проверить результат операции. Другое дело - если, как написал выше Qraizer, у тебя есть злоупотребление этими кастами - то значит что в твоей архитектуре что то не так.
      Сообщение отредактировано: KILLER -
        Цитата KILLER @
        А static_cast - кастит/не кастит на этапе компиляции. Т.к. у тебя абстрактный класс, от которого наследуется дочерний, значит для них будет сгенерирована VMT. И я не думаю что static_cast вообще знает о ее существовании, т.к. он работает совершенно в другом измерении. Возможно в Debug сборке и при простой архитектуре, компилятор еще на этапе компиляции видит косяк, понимает что тут ошибка, и подменяет static_cast каким нибудь dynamic_cast, или просто срабатывает каст, как если бы у тебя не было виртуальных методов. Но мне кажется что при полной оптимизации и немного усложненной архитектуре, если не вылетит ошибка компиляции, то это еще не значит что static_cast будет работать всегда стабильно.

        Я ведь написал, что в случае с виртуальным наследованием, static_cast вообще не компилируется! Пришлось поставить именно dynamic_cast. Тут без вариантов.
        И как оно примерно работает, я представляю.
        Правда, вот некоторые люди утверждают, что microsoft и некоторые другие реализации, выполняют проверку типов, по их символьным именам.

        Добавлено
        Цитата KILLER @
        А чем они аргументируют что это не круто?

        Серьёзной просадкой производительности.

        Добавлено
        Цитата KILLER @
        Другое дело - если, как написал выше Qraizer, у тебя есть злоупотребление этими кастами - то значит что в твоей архитектуре что то не так.

        Я это знаю. Об этом оговорился сразу. Архитектура это отдельная проблема. Потихоньку решаю.
          Цитата Eric-S @
          Я ведь написал, что в случае с виртуальным наследованием, static_cast вообще не компилируется!

          Могу лишь предположить, что при виртуальном наследовании создается какая нибудь виртуальная таблица классов, и компилятор на этапе компиляции понимает что static_cast тут применить в принципе не получится. А когда у тебя нет виртуального наследования, но есть виртуальные методы, и кастишь ты указатель на объект, то кастит этот static_cast так как умеет, т.е. твои виртуальные методы работать не будут. И получишь ты какой нибудь pure virtual call, но опять же повторюсь - это мое предположение. Я не уверен в том, что я прав на 100%.

          Цитата Eric-S @
          И как оно примерно работает, я представляю.

          Это все понятно. Но ответь на вопрос, мне просто реально интересно, чем аргументируют?
          Вот вопрос:
          Цитата KILLER @
          А чем они аргументируют что это не круто?
            Цитата KILLER @
            Соответственно - если ты выбрал использование динамического полиморфизма, значит использовать dynamic_cast - вполне нормально. И более того, это безопасно, т.к. можно проверить результат операции.

            Угу. Всё верно.
            Но-вопервых, виртуальные функции, не такие уж тяжолые. Зато дают плюсы.
            А во-вторых, динамическое приведение, это дополнительная примочка. Если она действительно нагружает ресурсы, то от неё придётся избавлятся. Ежели она быстро проверяет таблицу виртуальных членов, не отжирая ресурсы, то я бы занялся чем-то более интересным, чем попытки избавится от лишних кастов.
              Цитата Eric-S @
              Серьёзной просадкой производительности.

              А их не смущает что динамический полиморфизм как раз и есть причина серьезной просадки производительности? :D Ну это как знаешь, представь что Статический Полиморфизм - это гоночный болид, в него влазит 1 человек и все - едет быстро, весит мало. А Динамический Полиморфизм - это эдакий белаз - хранит кучу инфы, предоставляет гибкую работу с типами, но едет медлено, и весит много - жертвуешь серьезной просадкой производительности. Но зато в замен имеешь кучу бонусов и возможностей, которые без использования - не получил бы, так вот static_cast и dynamic_cast - это эдакие гаечные ключи к этим разным автомобилям. Один прямоугольный, а второй овальный. Так вот один ключ для гоночного болида - ты используешь не смущаясь, чтоб подтянуть гайки на колесах :D А вот второй ключ для белаза - ты использовать категорически отказываешься, аргументируя это тем, что ключ большой, и весит много. Лучше я буду затягивать гайки руками.
              Сообщение отредактировано: KILLER -
                Цитата KILLER @
                Это все понятно. Но ответь на вопрос, мне просто реально интересно, чем аргументируют?

                Кивают на снижение производительности, сравнение имён типов и прочую лабудень.

                Мне вот интересно, ты специально, перефразировал мой вопрос?

                Я ведь почему создал тему? Полистал инет, почитал всякие фразочки на счёт dynamic_cast и захотел понять, столь ли страшен зверь, как его малюют?

                А ты просишь пересказывать те самые байки, на которых я хочу поставить крест.

                Добавлено
                Цитата KILLER @
                А вот второй ключ для белаза - ты использовать категорически отказываешься, аргументируя это тем, что ключ большой, и весит много. Лучше я буду затягивать гайки руками.

                Я не отказываюсь. Боле того, я его активно применяю.
                Но вот некоторые говорят, что это черезвычайно плохо и приведёт к апокалипсису. А я не решаюсь выбросить удобный инструмент. Что-то в апакалипсис не верится.
                  Цитата Eric-S @
                  Но-вопервых, виртуальные функции, не такие уж тяжолые. Зато дают плюсы.

                  По сравнению с обычными функциями - они тяжелые. Причем на столько же на сколько dynamic_cast тяжелее static_cast. Понимаешь если смотреть на это все абстрактно - то dynamic_cast он тоже не тяжелый, ну подумаешь указатель там где то итерируется, сравнивая что то с чем то, но это ведь пустяк - если смотреть на это абстрактно, не сравнивая ни с чем, а хотя бы с возможностями современных компьютеров. А если начинать сравнивать со статикой - то динамика, как ни крути выходит более тяжелой.

                  Цитата Eric-S @
                  А во-вторых, динамическое приведение, это дополнительная примочка.

                  Это не дополнительная примочка, это неотъемлимый инструмент динамического полиморфизма, ровно такой же как чисто виртуальные методы, виртуальное наследование и другое.

                  Цитата Eric-S @
                  Если она действительно нагружает ресурсы, то от неё придётся избавлятся.

                  Ты не понял - у тебя не dynamic_cast нагружает ресурсы, а использование Динамического полиморфизма в принципе. Потому как это жрет больше памяти, потому что хранит информацию о типах, и работает медлено, потому что в куче и там как ни крути выполняются какие то операции, возможно иногда даже не тривиальные. Поэтому лично я считаю - что тебе нужно избавляться либо от динамического полиморфизма и отключать RTTI, а взамен придумывать что то, что тебе нужно на шаблонах. Так ты здорово выиграешь на скорости и памяти. А уж если ты используешь Динамический полиморфизм, то и нет никакого смысла отказываться от dynamic_cast, главное, что бы ты не просел в разы по скорости, нужно выносить его из всяких критичных мест - например циклы, лучше тогда сделать такую операцию до цикла(это если ты совсем уже параноик :D )

                  Добавлено
                  Цитата Eric-S @
                  Кивают на снижение производительности, сравнение имён типов и прочую лабудень.

                  А от нее никуда не уйти - даже если ты не используешь dynamic_cast.

                  Цитата Eric-S @
                  Мне вот интересно, ты специально, перефразировал мой вопрос?

                  Эээм. Где? Вообще у меня не было цели перефразировать твой вопрос или подменять понятия. Возможно я где то ошибся?

                  Цитата Eric-S @
                  Я ведь почему создал тему? Полистал инет, почитал всякие фразочки на счёт dynamic_cast и захотел понять, столь ли страшен зверь, как его малюют?

                  Ну я тебе все написал. Делай выводы - это не отдельный зверь, не примочка, не бонус - это неотъемлимый инструмент динамического полиморфизма. Главное применять его нужно с умом, а не лепить где попало - к месту и не к месту.

                  Цитата Eric-S @
                  А ты просишь пересказывать те самые байки, на которых я хочу поставить крест.

                  Эээм? Какие байки? :blush:

                  Цитата Eric-S @
                  Но вот некоторые говорят, что это черезвычайно плохо и приведёт к апокалипсису. А я не решаюсь выбросить удобный инструмент. Что-то в апакалипсис не верится.

                  Это хорошо, что не верится. Потому что скорее всего эти люди, которые кричат что де все проседает, не до конца понимают механизм работы динамического полиморфизма в целом. Да, можно отказаться от dynamic_cast, может где то, что то, ты даже и выиграешь. Но зато ты будешь без него изгаляться и плодить всякие левые ненужные сущности, применять durty хаки, и плодить скрытые ошибки, отказываться от клевых плюшек, и писать велосипеды, закладывая грабли как раз перед ногами.
                    Цитата KILLER @
                    Поэтому лично я считаю - что тебе нужно избавляться либо от динамического полиморфизма и отключать RTTI, а взамен придумывать что то, что тебе нужно на шаблонах. Так ты здорово выиграешь на скорости и памяти. А уж если ты используешь Динамический полиморфизм, то и нет никакого смысла отказываться от dynamic_cast

                    Вот! Это уже понятный ответ.
                    А поскольку от динамического полиморфизма избавится не представляется возможным, то значит оставляю dynamic_cast и прекращаю страдать.

                    Вынести из циклов... Это логично. Вообще, попробую конечно вынести, там, где это легко получится. А остальное, пусть будет.

                    Кстати, вот нашёлся старый тест https://tinodidriksen.com/2010/04/cpp-dynam...st-performance/
                      Каждый вызов виртуального метода - сродни вызову dynamic_cast по сути. Так как при вызове вирт. метода, происходит такой же обход VMT, как и при вызове dynamic_cast, ну возможно он немножко шустрее чем каст. Но производительность от этого все равно не вырастает.

                      Добавлено
                      Eric-S, а можешь плз кинуть ссылку, где пишут что dynamic_cast использовать не по феншую, и вообще все будет жутко тупить и чехлить. Мне просто интересно почитать. Если конечно ты это на веб сайте где то прочел, а не в реале слышал.
                        Цитата KILLER @
                        Эээм. Где? Вообще у меня не было цели перефразировать твой вопрос или подменять понятия. Возможно я где то ошибся?

                        Самое первое сообщение. Ну... Может этот вопрос немного не явный.Там их достаточно много.
                        "насколько тормозноый", "можно ли заменить static_cast или хаками?"
                        Впрочем, ты уже на все эти вопросы ответил. И разогнал мои сомнения.

                        Добавлено
                        Цитата KILLER @
                        а можешь плз кинуть ссылку, где пишут что dynamic_cast использовать не по феншую, и вообще все будет жутко тупить и чехлить.

                        Ну вот например в комментах https://habrahabr.ru/post/257071/
                        А вообще, несколько раз попадалось, в том числе на хабре.
                          Цитата Eric-S @
                          Кстати, вот нашёлся старый тест https://tinodidriksen.com/2010/04/cpp-dynam...st-performance/

                          Ну вот и ответ тебе. В разы медленее, в такие же разы динамический полиморфизм медленее статического ))
                            Цитата KILLER @
                            Каждый вызов виртуального метода - сродни вызову dynamic_cast по сути. Так как при вызове вирт. метода, происходит такой же обход VMT, как и при вызове dynamic_cast, ну возможно он немножко шустрее чем каст. Но производительность от этого все равно не вырастает.

                            Если так, то это не очень страшно. Конечно, будет промах кэша процессора. Ну да ладно, не критично, можно пережить.
                              Цитата Eric-S @
                              Ну вот например в комментах https://habrahabr.ru/post/257071/

                              Хм. Как по мне, так участник под ником dyadyaSerezha вполне доступно распедаливает оппоненту где он не прав. Плюс еще что то там даже переписал, замерил и получил результаты.
                                Цитата KILLER @
                                Ну вот и ответ тебе. В разы медленее, в такие же разы динамический полиморфизм медленее статического ))

                                Тест... По-моему немного надуманный и не совсем адекватный. Я сильно засомневался в его корректности. Но может я ошибаюсь или чего-то не понимаю. Поэтому не стал судить и учитывать.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 [2] 3 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1007 ]   [ 17 queries used ]   [ Generated: 29.03.24, 00:38 GMT ]