На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (16) 1 2 [3] 4 5 ...  15 16 все  ( Перейти к последнему сообщению )  
> Rust vs C++ , очередная шляпа
    Цитата D_KEY @
    Для приведенного плюсового кода компилятор вполне может так же сгенерировать код без обращения к vtable.

    Мы не говорим о мудрости компайлеров. Тут чисто концептуально - динамическая диспетчеризация ═► косвенные вызовы. Да, компайлер в ряде случаев ваще может методы заинлайнить. Но разговор не об этом.

    Цитата D_KEY @
    Но вообще подход Rust здравый.

    Вот тут не отвечу предметно, ибо учусь. Но, сска, чуйка подсказывает профит ...

    Скрытый текст
    Хистори

    Практически - де жа вю. Было время, писал на Virtual Pascal, а продвинутые "боссы" гнобили, мол Дельфи - это наше все, модно и современно! А работа была по массовой обработке и трансформации текстов (нормативка). 1997 год. Просто сдуру взялся за Perl. Сперва просто плевался. Как меня только не высмеивали, qwerty-$%#$-птичий язык. Но и тогда БЫЛА ЧУЙКА!!! Через месяцок я пишу обработчик за пол-часа, макс. час - коллеги в пару дней не укладываются на своем Дельфэ. И тогда я понял, это не вселенская мудрость - это практическая чуйка. Надо ее слушать! :lol:

    Вот о5 че-то подмывает ... :whistle:
      Цитата OpenGL @
      который является trait object-ом,

      Стоп! В доках о трэйтах и трэйт-обектах я читал. Это не одно и то же! Более того, я вааще могу не создавать ни явных трэйтов, ни трэйт-объектов!
      А только реализацию. Но давайте не отвлекаться. Читаем и повторяем ...

      Цитата D_KEY @
      Ты думаешь, что Impl'ы как-то иначе устроены?

      Это я чисто напомнить суть разговора, перевожу: "impl'ы всегда создают косвенные вызовы".
        Цитата JoeUser @
        D_KEY, и да ... твой код не эквивалентен "растовскому"! Я сперва тоже приплел виртуальные функции, потом подумал, что на 3 структурах можно и без ни

        Посыпаю голову пепломъ :lol:

        В посте с кодом С++ и Rust - я привел первый вариант (с виртуальными функциями), а в ссылке на он-лайн компилятор - привел код без них!

        С++ вариант должен быть вот так, без виртуальных функций:

        ExpandedWrap disabled
          #include <iostream>
          using namespace std;
           
          struct A {
            int a;
            A(int x);
            void print();
          };
           
          struct B : A {
            int b;
            B(int x, int y);
            void print();
          };
           
          struct C : B {
            int c;
            C(int x, int y, int z);
            void print();
          };
           
          A::A(int x):a(x) {
          }
           
          void A::print() {
            cout << a << endl;
          }
           
          B::B(int x, int y):A(x),b(y) {
          }
           
          void B::print() {
            A::print();
            cout << b << endl;
          }
           
          C::C(int x, int y, int z):B(x,y),c(z) {
          }
           
          void C::print() {
            B::print();
            cout << c << endl;
          }
           
          int main() {
            C c = {1,2,3};
            c.print();
            return 0;
          }


        Да, это мой косяк! :blush:
          Цитата JoeUser @
          Это я чисто напомнить суть разговора, перевожу: "impl'ы всегда создают косвенные вызовы".

          Суть? А по-моему изначально суть была в самом наличии VMT :crazy:
          Вообще, очевидно, зависит от конкретного сценария использования. Если ты юзаешь статическую диспетчеризацию, то компилятору нет смысла делать виртуальный вызов, и для этого даже оптимизатор не нужен. А вот создавать или нет VMT для конкретного типа (и именно об этом я говорил в прошлом своём комментарии) уже зависит только от оптимизатора.
            JoeUser, ты можешь поиграться на https://play.rust-lang.org/
            Умеет выводить asm и llvm-ir
              Цитата OpenGL @
              А вот создавать или нет VMT для конкретного типа (и именно об этом я говорил в прошлом своём комментарии) уже зависит только от оптимизатора.

              Я утверждаю - без динамической диспетчеризации VMT в Расте быть не должно!

              Ты ответил:

              Скрытый текст
              Цитата JoeUser @
              Цитата D_KEY @
              Ты про это?
              Нет. Наличие виртуальных Функций - это уже наличие VMT. А это не по фэн-шую :)

              Ты думаешь, что Impl'ы как-то иначе устроены? :)

              Такшта давай определяться :lol: Impl'ы - действительно тупые и всегда лепят VMT (или vtable), или ты решил внезапно "приукрасить" недопиленность Раста?

              Добавлено
              Цитата OpenGL @
              А вот создавать или нет VMT для конкретного типа (и именно об этом я говорил в прошлом своём комментарии) уже зависит только от оптимизатора.

              :blink: чисто интерес !!! Покажи мне с Раст ну или С++ вариант, когда не используется динамическая диспетчеризация - но VMT па-любэ строятся! Я просто должен это увидеть!!! :wall:
                OpenGL, D_KEY, с вашего позволения, я немножко, промежуточно, резюмирую!

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

                Я же аппелирую к здравому смыслу. С++ этого не делает, и это состоявшийся язык. Rust - гораздо моложе, но имеет "базу", включая тот же C++", и свой некороткий путь развития. И не должен этого делать... А вдруг вы правы? Доказательства! :)
                  Мне кажется, что есть какое-то недопонимание :)
                    Цитата JoeUser @
                    Покажи мне с Раст ну или С++ вариант, когда не используется динамическая диспетчеризация - но VMT па-любэ строятся! Я просто должен это увидеть!!!

                    Тебя только что интересовало не наличие VMT, а есть виртуальный вызов или нет. Всё-таки теперь тебя уже VMT интересует? :lol:
                      Цитата OpenGL @
                      Тебя только что интересовало не наличие VMT, а есть виртуальный вызов или нет

                      Упс ... Чисто мое скромное имхо ... А как ты представляешь себе виртуальный вызов без VMT (ну или аналога)? :blink:
                      Скрытый текст
                      Дабы не был кривотолков. "Есть ли виртуальный вызов" и "наличие VMT" - для меня вопросы в принципе эквивалентные. Прямой вызов или косвенный. Просто трактовка разная.

                      Цитата D_KEY @
                      Мне кажется, что есть какое-то недопонимание :)

                      Все возможно, даже то - что быть не может :lol: Вощем ... проясняй, а я подтянусь! :lol:
                        Цитата OpenGL @
                        Тебя только что интересовало не наличие VMT, а есть виртуальный вызов или нет. Всё-таки теперь тебя уже VMT интересует? :lol:

                        Зы - ты плохой :lool: Дай линк на мой пост, где мне на VMT пофик и только виртуальные вызовы интересуют.
                          Цитата JoeUser @
                          Покажи мне с Раст ну или С++ вариант, когда не используется динамическая диспетчеризация - но VMT па-любэ строятся!
                          Прям-таки сходу не приведу, но опишу Плюсовый сценарий.
                          Пишем шаблон класса с хотя бы одним виртуальными методом. Явно его инстанцируем каким-либо набором шаблонных параметров. Никуда компилятор не денется, ему придётся сынстанцировать все методы и построить VMT. При этом в программе может не быть ни одного виртуального вызова, но компилятор об этом знать не может. Впрочем, грамотный линкер сможет соптимизировать, но это будут его личные особенности.
                          Вероятно, это не тот сценарий, который ты искал, JoeUser, однако вот он. В целом полиморфизм можно построить и руками на обычных указателях на функции, хоть и на С. Считать ли подобный велосипед за VMT, я не знаю.
                            Цитата JoeUser @
                            Упс ... Чисто мое скромное имхо ... А как ты представляешь себе виртуальный вызов без VMT (ну или аналога)? :blink:

                            Я затруднюсь представить, что тебя заставило представить, что я представляю виртуальный вызов без VMT (ну или аналога) :D

                            Добавлено
                            Цитата JoeUser @
                            Цитата OpenGL @
                            Тебя только что интересовало не наличие VMT, а есть виртуальный вызов или нет. Всё-таки теперь тебя уже VMT интересует? :lol:

                            Зы - ты плохой :lool: Дай линк на мой пост, где мне на VMT пофик и только виртуальные вызовы интересуют.

                            Блин, давай сначала. В коде, представленном тобой, а также в коде наподобие
                            ExpandedWrap disabled
                              trait Foo
                              {
                                  fn foo();
                              }
                               
                              fn call_foo<T: Foo>(a: T)
                              {
                                  a.foo();
                              }

                            я нахожу маловероятным то, что компилятор вставит в них виртуальный вызов потому что в нём компилятор знает исходный тип элементов. При этом вопрос наличия VMT у типа, имплементящего это самое Foo, совершенно ортогонален первому - очевидо, она будет если ты юзаешь виртуальные вызовы, а если нет, то её наличие - вопрос исключительно оптимизатора, и ответ я на него не знаю, так что разберись уж как-нибудь сам с ним (ссылки на онлайн-дизассемблер раста кидали выше), раз уж для тебя это настолько важно, что ты готов "забыть про раст" (с) ежели что не так :D
                              Цитата Qraizer @
                              хотя бы одним виртуальными методом.

                              Если компайлер "агрицца" на виртуальный метот неразвернутого шаблона - это плохой компайлер! ИМХО, он должен сперва развернуть все, и только потом - строит код. Низачот! :)

                              Add:

                              ЗЫ: Хотя ... В нынешней реализации - ты скорее прав! Если бы развертка шаблонов была шагом а-ля "пост-пре-процессор" - да, можно было бы на компилятор ругаться. А пока - только на линкер надежда, что он "склеит", а что выкинет.
                                Цитата OpenGL @
                                то её наличие - вопрос исключительно оптимизатора

                                :wacko: - извини за мой французский ... не оптимизатора - а говнятора! зачем деспетчировать функции, которые в этом не нуждаются?! Это вопрос оптимизатора?

                                Цитата OpenGL @
                                так что разберись уж как-нибудь сам с ним

                                А-я-яй!!! Это пост в стиле "сетьлера"© - типа я задекларирую какую-то левую шляпу, и если не разберетесь - вы ламеры!

                                Цитата OpenGL @
                                что ты готов "забыть про раст"

                                Вестись на слабо - это прекрасно! :lol:

                                Цитата OpenGL @
                                я нахожу маловероятным то, что компилятор вставит в них виртуальный вызов потому что в нём компилятор знает исходный тип элементов

                                И я нахожу это! А "они" - нет :lol:
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (16) 1 2 [3] 4 5 ...  15 16 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0525 ]   [ 16 queries used ]   [ Generated: 20.04.24, 15:01 GMT ]