1. C++ / Говнокод #25315

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    HRESULT SomeClass::GetVersion(std::wstring& version)
    {
        CComBSTR versionBstr;
        m_Interface->get_Version(&versionBstr);
        version = std::move(std::wstring((_bstr_t)versionBstr, versionBstr.Length()));
        return S_OK;
    }

    Как показать в одном методе (не)знание move семантики, правил приведения типов и COM фреймворка

    Запостил: salamon_style, 18 Января 2019

    Комментарии (42) RSS

    • Прошу прощения, не подумал и поторопился оценить.
      Ответить
    • а так же неумение проверять результат вызова get_Version
      Ответить
    • > COM фреймворка

      Такого не знать.
      Ответить
      • Вот ты зануда, 1024 на тебя нету.

        Чем Component Object Model не фреймворк?
        Ответить
        • подключил DOM фреймворк, проверь.
          Ответить
          • Может быть вы не знаете что такое COM?
            Как классы в реестре регистрируются? Как сервера создаются отдельно стоящие или внутри процесса? Как через IDL клиенты создаются?
            Ответить
            • лол, да мне пох) я их на хую вертел как и реестры. понабирают по обьявлению какие-то комы. вот те либа, вот те хедер файл, вот те dll, вот те конфиг файл, хуле еще надо? зачем какую-то питушню придумывать ввиде реестра и ком обьектов. еще бы ActiveX вспомнили.

              по этому я за линух и форки.
              Ответить
              • Понапридумывают хуйни всякой - "хедеры", "dll", "конфиги"...

                Взял "пхп" файл, положил в папку, которую "апач" видит и всё готово.

                Поэтому я за "пхп".
                Ответить
              • Я понимаю что тебе пох, я просто хотел сказать что ирония немного не умесна: DOM это API, а COM это вполне себе фреймворк.

                COM был не плохой задумкой: кросс-языковой (а в случае IDispatchable даже с доступом из скриптовых языков), с версии DCOM еще и с доступом по сети.. Без кома винда бы может и не выстрелила.

                Кстати, ActiveX это тоже COM.

                Но говна в нем очень много, тут не поспоришь.

                В линухе тоже есть свой COM: называется D-Bus. Он еще пока не так распостранен, но Поттеринг не зря хлеб кушает. Скоро виндуос будет казаться простым и понятным на фоне очередного линукса:)

                А что ты имеешь ввиду под форками? Системный вызов fork? Он нравится тебе больше, чем pthreads?
                Ответить
                • > больше, чем pthreads
                  Ну да, процессы понятнее и безопаснее этих ваших "тредов".
                  Ответить
                  • Есть такое дело, именно потому чуть ли не до начала 21 века практически весь юниксовый софт был многопроцессным (например, Apache 1). Postgres до сих пор форкается.

                    Тем более что в линуксе под капотом все равно это одно и тоже, разве что TLB разный. Вот на винде другое дело, там поток реально тяжелее процесса
                    Ответить
                    • > там поток реально тяжелее процесса
                      Разве? Процесс (в виндах) — это же просто обёртка над группой потоков, как он может быть легче?
                      Ответить
                      • Я сказал хуйню опечатлся: конечно же поток ЛЕГЧЕ процесса.
                        Ответить
                    • Вот кстати, с тредами у тебя вся память общая (кроме мелких островков в tls). Нет никакого контроля, можно даже соседнему треду стек засрать.

                      Между процессами же шарятся только те данные, которые ты реально хочешь расшарить.

                      Но победили унылые и менее гибкие треды.
                      Ответить
                      • Я не знаю точно как там с тредами в других ОС: в BSD и Solaris кажется это не так как в линукс, кажется даже что у Solaris потоки вообще очень хороши.

                        И возможно что там есть серьезная разница по перформансу, как и в винде. Нет?


                        зы: а есть еще всякие fiber: юзерспейсные треды с кооперативкой.
                        Понаплодили блядь сущностей, зла не хватает.

                        В 90е все форкались и ничо
                        Ответить
                        • простите что так вмешиваюсь в дискуссию. а Solaris - это JVM которая смогла стать ОС?
                          Ответить
                          • Нет, что ты.

                            Solaris это такой проприетарный Unix который делал Sun с начала 80х. Сначала на основе BSD (и назывался SunOS), затем на основе System V.

                            Это было за долго до JVM, хотя конечно JVM был реализован на Solaris сначала.

                            Изначально она была только под SPARC (сановые процы) но в нулевых ее портировали на x86.

                            У нее много крутых штук: зоны для изоляции процессов, файловая система zfs скрещенная с диспетчером томов и поддержкой снепшотов (никто так больше не умеет!).

                            На Java она похожа разве что кучей XMLя (там на нем половина конфигов), пафосной виртуальностью (как в J2EE) и довольно выскими требованиями к памяти
                            Ответить
                        • > разница по пирфомансу
                          Но ведь это не из-за того, что в венде треды хорошие. Там просто процессы очень медленно стартуют. Форк, конечно, очень странная идея, но позволяет запускать процессы уже прогретыми.

                          А тред, по сути, тот же форк, только вся память в режиме shared.
                          Ответить
                          • Пожалуй, есть еще административное отличие.

                            Пользователь хочет видеть процессы в списке задач. А потоки не хочет.

                            Я знаю что вот у меня есть инстанс MSSQL, вот его PID, и могу его грохнуть. Зачем мне знать что там внутри 1902 потока и их TIDы?


                            >>А тред, по сути, тот же форк, только вся память в режиме shared.
                            ну, на линуксе же это и есть просто clone с ключиком о том как шарить память
                            Ответить
                            • Бля, ну есть же иерархия процессов, процесс группы в конце концов. Показывай только лидеров групп и не будет мусора. Ну или скрой всех, кто форкнулся без экзека.

                              > хочет видеть процессы
                              А видит там вкладки хрома.
                              Ответить
                              • Кстати, на виндуосе иерархия процессов весьма условная.
                                В EPROCESS (структура которая в executve, не путать с KPROCESS которая в ядре!) есть поле ``InheritedFromUniqueProcessId``.

                                Но оно опцЫонально. Даже в ProceXP видно что не все процессы имеют папу. Например потому, что папа умер (а удочерять как в юниксах там не принято).

                                Так что я вообще не знаю зачем там это поле, кроме как разве что дерево показывать.

                                Вот в unix -- там всегда папка есть. Не совсем понятно правда как ты собираешься это использовать.

                                Показывать всех, кто прямой потомок init или кто прямой потомок session leaderа (шела на терминале)?

                                В процесс группах и вовсе может быть куча процессов, и они явно не дети груп лидера (например ``fuck | petuh | sosat`` это одна группа же).

                                >>А видит там вкладки хрома.
                                лол)) зачет

                                >> кто форкнулся без экзека.
                                Вот это дело! А как это узнать?
                                Ответить
                                • > А как это узнать?
                                  Х.з., добавить exec'нутым какой-нибудь флажок?

                                  Я вот с процессами основную траблу вижу в управлении памятью. Если на 64-битке ещё можно себе позволить отдать половину пространства под shared и половину под private, то на 32-битке с этим будет боль. А shared память хотелось бы видеть по одинаковым адресам во всех процессах, которые её юзают.
                                  Ответить
                      • > Но победили унылые и менее гибкие треды.

                        Используй линупсовый системный вызов clone для максимальной гибкости:
                        > clone() creates a new process, in a manner similar to fork(2).

                        > This page describes both the glibc clone() wrapper function and the underlying system call on which it is based. The main text describes the wrapper function; the differences for the raw system call are described toward the end of this page.

                        > Unlike fork(2), clone() allows the child process to share parts of its execution context with the calling process, such as the virtual address space, the table of file descriptors, and the table of signal handlers. (Note that on this manual page, "calling process" normally corresponds to "parent process". But see the description of CLONE_PARENT below.)

                        В glibc для Linux эти pthread-ы как раз через clone() и реализованы
                        Ответить
                        • CLONE_PID. Заебись, можно было процессов с одинаковым id наплодить...
                          Ответить
                        • >Используй линупсовый системный вызов clone для максимальной гибкости
                          угу, и для максимальной переносимости тоже

                          >В glibc для Linux эти pthread-ы как раз через clone()
                          и форки и птреды

                          у ядра вообще есть только клон. Все остальное лишь семантика.
                          Ответить
                          • Я сомневаюсь, что все эти процессы, нити, волокна, вилки вообще переносимы. Обязательно найдётся система, где что-то сделано не так и придётся переписывать.
                            Ответить
                            • pthreads и fork оче даже переносимый, ты чево
                              это же SUS
                              Ответить
                • если чесно, я вообще не понимаю, какой смысл было воспринимать мой комент про DOM серьезно. можно ведь было шуткой про смузи, JS или питухов обойтись
                  Ответить
                  • В этом вашем «Говнокоде» хрен поймёшь, кто прикалывается, а кто реально крейзи.
                    Ответить
            • Иногда мне кажется, что лучше бы я не знал, что такое COM. Спалось бы спокойней.
              Ответить
              • ты просто ненавидишь всё виндузятное:)

                Но MS еще в нулевых решило плыть от компа в сторону вебсервисов
                Ответить
                • Веб-десктоп в 98 винде? Кстати, а почему сейчас нету браузера, встроенного в рабочий стол?
                  Ответить
                  • Нет, я не про ActiveDesktop.

                    Обычно он у меня выглядил вот так:
                    https://i.stack.imgur.com/XEeFv.jpg

                    Я про то, что если в 98м году MS говорил:
                    "Возьми С++ и сделай компонент который умеет считать бизнес-логику и сделай к нему IDL. Пусть его дергают, может даже по сети".

                    То в 2008м он говорил:
                    "Возьми С# и сделай компонент который умеет считать бизнес-логику и сделай к нему .wsdl. Пусть его дергают по SOAP, может даже по сети".

                    Теперь, вероятно, SOAP заменил REST.

                    >> Кстати, а почему сейчас нету браузера, встроенного в рабочий стол?
                    Может и хорошо что нет, но скоро кроме браузера не будет приложений
                    Ответить
                    • ты хотел сказать, кроме хрома? :D

                      зы: а крузис и батлфилд где запускать-то?
                      Ответить
                      • WebGL
                        Ответить
                      • В 2040 году все игры будут написаны на JavaScript. И исполняться будут прямо в браузере, написанном на JavaScript
                        Ответить
                        • но ведь на плюсах они будут еще быстрее, а значит будет зазор производительности в который можно втыкнуть еще какой-то ниибаццо крутой рендер шнурков на ботинках ГГ, которые лежат в шкафу.
                          Ответить
                          • В 2040 году стандарт С++ будет включать 2048 томов документации и будет так сложен, что ни один человек не сможет писать на С++.

                            Люди напишут на Haskell специальную программу для генерации кода на С++
                            Ответить
                        • Причём этот браузер сам по себе операционная система и ядро его написано на JavaScript.

                          irq[1] = function() { ... }
                          Ответить
                          • irq[1] = function()
                            {
                            regs['ax'] = 5;
                            int(13);
                            //или так
                            io[1024] = 42;
                            }
                            Ответить

    Добавить комментарий