1. JavaScript / Говнокод #27106

    0

    1. 1
    https://tproger.ru/articles/frontend-roadmap-2021/

    Как много надо учить ради того, чтобы клепать красивые формочки.
    Они там совсем ебанулись?

    Запостил: YpaHeLI_, 12 Ноября 2020

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

    • > Хипстерский говносайтик для вайтишников

      Не, ну а что ты ожидаешь от такой хуйни?
      Ответить
      • https://tproger.ru/articles/about-rgbduino/ - вон, смотри как круто, ардуина с анимешными девочками, ути-пути!!!
        Ответить
        • AVR вместо процессора и ушек нету.

          Какой анскилл (((
          Ответить
    • > надо учить

      Зачем? Зачем? Следуй заветам Ротоёба и ты сможешь клепать красивые формочки уже сегодня.
      Ответить
      • лол, GraphQL
        хуита
        несколько месяцев ебались на основном проекте этого года, преодолевая это говно, в итоге психанули и переделали всё на старый добрый рест

        нигде не спасает, только лишнюю работу приносит, и ещё и неоптимально работает
        Ответить
        • Подтверждаю

          У меня сейчас какой-то graphql похожий на рест на беке

          Но мне все кажется что это бекендщики анскилльные не могу правильно graphql сделать
          Ответить
      • Да я просто выпадаю со всего этого веб-кодинга.
        Куча хипсторских js - фреймворков, куча всяких LESS, SCSS и прочей питушни.
        Понимаю еще на бекенде ОRМ + MVC - это годно и экономит кучу времени.
        Bootstrap тоже неплох, но если лезть в его внутренности то пока поймешь как переделать какой-нибудь компонент под себя - потратишь уйму времени.
        Но сэкономит ли кучу времени какой-нибудь React или Angular?

        Это ли не то, что называется overengineered shit?
        Ответить
        • Если ты собираешься делать серьезный фронт, то да, вероятно.
          Ответить
        • > сэкономит ли кучу времени какой-нибудь Angular

          Да. Я сварщик не настоящий, но с Angular JS вьюхи получалось делать на порядок быстрее чем вручную. Да и не такой уж там rocket science.
          Ответить
    • https://tproger.ru/articles/what-c-is-good-for/

      > Для чего хорош Си?

      > Оптимизация участков кода на C++

      > Объектно-ориентированные возможности C++ часто обходятся дороже, чем «чистый Си», так как расходуют больше ресурсов (в частности оперативной памяти). Поэтому иногда код в стиле Си может быть эффективнее. Если нужно заставить какой-либо алгоритм работать быстрее — используйте процедурный стиль и откажитесь от встроенных инструментов C++ для ООП, например от полиморфизма.

      А есть ли реальные примеры, когда код в стиле C++ эффективнее?
      Ответить
      • > Почти для всех этих применений используется PIC код (position-independent code — код, не зависящий от адреса). Он может выполняться в любом месте памяти, независимо от того, где находится и кто его запустил. У PIC-кода нет доступа к глобальным переменным и таблицам, поэтому C++ для его написания не подойдёт (классам C++ нужны глобальные таблицы для реализации наследования).

        Блядь, да что вы несете нахуй?
        Ответить
        • Ебать дауны. Они предлагают шеллкод на сишке писать? Я бы на это посмотрел.
          Ответить
          • Предлагаешь написать его на крестах?

            На самом деле с -fPIC и без глобалок должно прокатить.
            Ответить
            • >>> Such code accesses all constant addresses through a global offset table (GOT). The dynamic loader resolves the GOT entries when the program starts (the dynamic loader is not part of GCC; it is part of the operating system).

              UPD: Ну и в самом деле, откуда адреса функций-то брать?
              Ответить
              • >> без глобалок
                Ответить
                • Без глобалок и без вызовов любых внешних функций. Остаётся только открыть asm() и хуярить, лол.
                  Ответить
                  • Да почему. Отключи райнтайм. Включи raw линковку. И хуярь на сишке или даже крестах.

                    Ну разве что для сисколла придётся одну инструкцию на асме написать.
                    Ответить
                    • Ну так а какой смысл? Получится голый си, даже memcpy() банальный безопасно не позвать.
                      Ответить
                      • Эм, ну это же удобнее чем на асме руками хуярить? Не?
                        Ответить
                        • Не уверен. Это же шеллкод, а не просто абстрактный PIC. То есть нам постоянно надо применять какие-то хардкорные хаки, то же упомянутое j123123 получение (E|R)?IP. Зачастую нужно хитро ровнять стек, точно располагать структуры в памяти и прочую питушню. К тому же, за всем этим непотребством очень просто простить какое-нибудь UB, после чего компилятор радостно выкинет к хуям всё, что ты так старательно писал. Ну и реальный пример с memcpy() показателен, да.
                          Ответить
                      • > memcpy

                        Самое забавное, что мемсру очень сложно запилить самому. У меня вместо него рекурсия получалась т.к. конпелятор упорно выбрасывал его тело и заменял на... вызов мемсру.
                        Ответить
                        • > У меня вместо него рекурсия получалась т.к. конпелятор упорно выбрасывал его тело и заменял на... вызов мемсру.

                          Можно поотрубать эту оптимизацию соотв. опциями.

                          https://stackoverflow.com/questions/57539509/
                          Ответить
                          • Ну да. Просто первый раз это вызывает разрыв шаблона.
                            Ответить
              • > адреса функций

                У call в пределах одного бинаря же относительная адресация, зачем ему адреса?
                Ответить
            • Если архитектура не гарвардская и нет никаких W^X, я и на PIC тебе глобалок понаделаю. А если W^X есть, то только константных глобалок.
              Ответить
              • На самом деле, x86_64 и так умеет rip-related адресацию. И никакие готы ему в пределах модуля не нужны.
                Ответить
                • Даже если б не умел, это все легко костылится, можно из стека адрес возврата узнать. https://govnokod.ru/1520

                  Достаточно его единожды узнать, и можно его где-нибудь в регистре хранить, и от него дальше отталкиваться для вызова функций. Ведь относительные расположения всей хуйни известны на этапе компиляции
                  Ответить
                  • > из стека

                    Ну конпеляторы такой приём не юзают. Это всё-таки дороже чем готы. Да и новым процам это очень не нравится т.к. дизбалансит стека возвратов.
                    Ответить
                    • > Ну конпеляторы такой приём не юзают.

                      Проблемы негров шерифа не волнуют. Вполне можно написать компилятор, который такую хуйню использует

                      > Да и новым процам это очень не нравится т.к. дизбалансит стека возвратов.

                      Там и без дизбаланса можно

                      GET_ESP:
                      mov eax, [esp]
                      ret

                      и потом где-то делаем
                      call GET_ESP
                      Ответить
        • ничего не понимаю

          во-первых для "реализации наследования" С++ ничего не нужно насколько я понимаю, "таблицы" нужны для виртуальных методов, а наследование != виртуальные методы (если ты не скриптушок и не джавушок часом)

          во-вторых у PIC кода вроде как вначале есть волшебное число, от которого считаются все оффсеты. Либо же они все считаются от какого-то регистра. В каком-то смысле "близкие" указатели в сегментной адресации моего досвоого детсва это и есть PIC код, не?


          Чем глобалки отличается от других данных? Почему нельзя адреса к ним иметь относительные?
          Ответить
          • > почему нельзя адреса иметь относительные

            Спроси у разрабов 8086, лол. На arm'е или x86_64 такой проблемы нет.

            Доступ к глобалкам у pic кода, разумеется, есть. Иначе совсем пиздец был бы. На х86 на это тратится регистр, емнип.

            > наследование

            Нахуй нужно наследование без виртуальных методов? Это же антипаттерн наследование-ради-реализации. Ну разве что миксины из него сделать.
            Ответить
            • а, ты имеешь ввиду, что нельзя адресоваться косвенно, не пропатчив код, и загрузчик вынужден был его патчить?

              >Нахуй нужно наследование без виртуальных методов?
              Если строго выполняется "is-a", то вполне симпатично выглядит. Миксины в крестах на шаблонах делают?
              Ответить
              • Ну да, косвенной адресации об eip нету. И сам eip без пердолинга не достать.
                Ответить
                • А как делали PIC в 32? Каждый символ отмечали в GOT, и потом лоадер его пирдолил?
                  Ответить
                  • GOT вроде на любой архитектуре нужен если у тебя so'шки с pic'ом.

                    Это немного ортогональная проблема -- как-то надо узнавать адреса функций в других модулях.
                    Ответить
                    • так как же делали?

                      GOT:
                      petuh: [place addr here]

                      jmp $petuh

                      потом лоадер меняет петуха на реальное числ?
                      Ответить
                      • Ну да. Т.е. у тебя 2 задачи:

                        1) Найти где твои собственные глобалки, на нормальных архитектурах это элементарно т.к. есть ip relative адресация
                        2) Найти чужие глобалки и функции, для этого в твоих глобалках лежит GOT которую патчит линкер

                        Как-то так вроде.
                        Ответить
                        • все, понел

                          на 32 битах легко найти только автоматические переменные (адресуясь от SP или BP, причем в древности вроде от SP было нельзя) а глобалки без GOT тебе не нати.

                          на 64 можно найти глобалки адресуяь от R.I.P, то есть лоадер должен просто поместить твой код на столько же байт на север от глобаки, чтобы ты смог его найти по IP.

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

                          глобалки на 32х битных либах не только дурной вкус, но еще и более медленая загрузка кода, лол
                          Ответить
                          • Для своих глобалок гот не нужен. Они всегда на правильном оффсете относительно кода. Секции одного бинаря слава богу никто не двигает.
                            Ответить
                            • в 64 да
                              но в 32 ты не можешь оффсетица от кода
                              так?
                              Ответить
                              • Да, поэтому надо eip или базовый адрес своих глобалок в каком-то другом регистре.

                                Но таблица там не нужна, просто база относительно которой ты уже знаешь оффсеты.
                                Ответить
                  • На виндах это называется «base relocation table», кстати: https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#the-reloc-section-image-only.

                    Как-то раз патчил бинарник и очень удивился, когда после загрузки обнаружил похеренный в случайных местах код. Дошло до того, что я тогда довольно длительное время дебажил процедуры PE-загрузчика, пока не нашёл процедуры, ответственные за парсинг и применение этой самой таблицы релоков, лол. Пришлось ещё и таблицу патчить.
                    Ответить
                    • Не совсем. GOT в виндовых терминах - это таблица импортов dll'ки. А релоков в so на прыщах нет ибо position-independent code.
                      Ответить
                      • > А релоков в so на прыщах нет

                        Это не так. В прышах .so с релоками возможны
                        https://stackoverflow.com/questions/7131360/
                        Ответить
                        • > возможны

                          Это да, ну потому что тот же самый elf, что и для объектников. А в реальной жизни они встречаются?
                          Ответить
                          • Ну вон кто-то собирает на стековерфлоу, значит встречается.
                            Ответить
                            • Интересно, а оно вообще запустится? Динамический линкер обязан уметь релоки, как и обычный линкер?
                              Ответить
                              • > Интересно, а оно вообще запустится?

                                А почему б ему не запуститься?
                                https://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries - Load-time relocation in action

                                > Динамический линкер обязан уметь релоки?

                                Динамический линкер чего? Может быть в POSIX стандарте где-то написано, что динамический линкер чего-то там обязан, но я вообще хз
                                Ответить
                                • > А почему б ему не запуститься?

                                  Ну у меня, к примеру, на amd64 вообще не компилятся либы без -fPIC.

                                  relocation R_X86_64_PC32 against symbol `x' can not be used when making a shared object; recompile with -fPIC

                                  З.Ы. Хотя пишут можно как-то модель памяти другую выбрать в опциях. Но х.з. что там с пирфомансом после этого станет.
                                  Ответить
                                • А, понял кажется в чём там проблема с моделью... amd64 не умеет 64-битные оффсеты в инструкциях. Поэтому в общем случае такой релок запатчить не получится.

                                  Винда, если я не туплю, позволяет запускать такие проги, упихивая бинари в первые 4 гига, но от этого страдает ASLR. А Линус, видимо, решил что упихивать 64-битный код в 4 гига - это полное уебанство и вообще запретил.
                                  Ответить
                                  • > amd64 не умеет 64-битные оффсеты в инструкциях. Поэтому в общем случае такой релок запатчить не получится.

                                    Можно адреса непосредственно в опкодах соотв. инструкций запатчить.
                                    Ответить
                                    • > непосредственно в опкодах

                                      Дык в том и жопа, что в опкодах только 32 бита. Если надо 64, то только через загрузку в регистр. Большая модель так и делает.
                                      Ответить
                                      • всмысле иммидиейтом можно только 32 бита указать?
                                        Ответить
                                        • > иммидиейтом можно только 32 бита указать

                                          Да.
                                          Ответить
                                      • > Если надо 64, то только через загрузку в регистр.

                                        Ну так в инструкции загрузки в регистр и пропатчить
                                        Ответить
                                        • > Ну так в инструкции загрузки в регистр и пропатчить

                                          Ну так надо чтобы конпелятор сначала такую инструкцнию воткнул! А он с дефолтной моделью памяти (medium или что там) так не делает.
                                          Ответить
                    • а как зашарить dllку между процессами на 32х битной винде, если там нужно править таблицу?

                      я наверняка читал про это, но уже забыл, а зачем читать снова, если на гк всё знют?
                      Ответить
                      • А никак. Системные либы специально сделаны под разные адреса. А остальные не так уж сильно и шарятся.

                        В линуксе вроде раньше тоже такой хуйнёй страдали (man prelink).
                        Ответить
                        • Интересная работа была у лоадера: загрузи либы так, чтобы они желательно не совпадали адресами, пушо если совпадут -- придется два раза грузить одно и тоже в память патча адреса по разному.

                          Какой багор)

                          >prelink
                          у винде тоже вроде была такая тула для разработчиков либы?
                          Ответить
                          • Он и сейчас так грузит, если верить Реймонду... Запоминает какой адрес либе достался от ASLR и пытается упихать её в остальные процессы по тому же самому. Ну в 64-битном пространстве конечно легко их раскидать подальше друг от друга.
                            Ответить
                            • но если у тебя пик, то разве нельзя просто каждому процессу замапить либу по разному адресу, если там все от рипа считается?

                              зы: нашел, как прелинк на винде назывался

                              In Visual Studio 2008 environment, an application can be bound to DLLs by using editbin /bind[:PATH=path]. editbin (referred to officially as Microsoft COFF Binary File Editor) replaces what used to be bind.exe (and rebase.exe which used to be used to change preferred load address of binary and thus avoid address range conflicts among DLLs and speed up load times).
                              Ответить
                        • > Системные либы специально сделаны под разные адреса.
                          В пределах одного сеанса системные либы одной битности (ntdll, kernel32, user32 вроде тоже) грузятся по одному адресу во все процессы. Иначе из-за релоков действительно пришлось бы каждому процессу иметь по своей собственной копии каждой системной либы, что немножко пиздец.
                          Ответить
                          • то есть если у меня три пользователя сидит на винде, то у каждого была своя версия kernel32.dll в памяти?

                            хорошо было было серверам с толпой питухов по RDP
                            Ответить
                            • > у каждого была своя версия

                              Иначе они друг друга переломают, лол.
                              Ответить
                              • сухя бы они переломают, если там RO страничка?

                                а если она не RO, то что мешает мне ловко сломать все приложения, работаюшие от моего имени?



                                разве что я могу узнать адреса и сделать шеллкод, но речь-то про 32, так и так адреса были боль мень известны как я понима
                                Ответить
                            • Насчёт именно сеанса я не уверен (постоянно путаюсь в этих виндотерминах). У одного пользователя они точно грузятся по одному адресу до перезагрузки, а вот как обстоят дела у двух разных юзеров — надо курить маны.
                              Ответить
                              • ну есть сессш, это сессия пользователя на данной машине. Сервисы работают в нулевой сесси

                                Относительно сессии адресуется всякие говны обжменеджера

                                В сессии есть воркстейшены (только WinSta0 имеет доступ к экрану) в нем есть десктопы.

                                не следует путать сессии и того сессии LSA.

                                кое-что в памяти шарица внутри сесси, нужно читнуть
                                https://techcommunity.microsoft.com/t5/ask-the-performance-team/sessions-desktops-and-windows-stations/ba-p/372473
                                Ответить
                                • Спасибо.

                                  Сейчас проверил — адреса системных либ в csrss.exe и случайном процессе, запущенном от моего юзера, совпадают.
                                  Ответить
                                  • Ну т.е. труъ ASLR только на прыщах.
                                    Ответить
                                    • ASLR скорее нверное про екзешники, чтобы он грузился каждый раз по разному адресу, и нельзя было загрузица ему в адресное пространство и серануть?

                                      алсо, системные либы на 64битной винде могут грузиться каждый раз в разное место после перезагрузки, не?

                                      кстати, опенбздя сделала еще круче
                                      https://undeadly.org/cgi?action=article&sid=20170613041706&mo de=expanded&count=18
                                      Ответить
                                      • Либы тоже очень важно рандомизировать. Желательно все. И кучу и стек и даже аллаха.
                                        Ответить
                                        • ну то есть типа я хакер, запустил свою тулу, она узнала, что либа petuh.dll лежит по адресу ABC123, и что она древняя и не патченная, и понял, что она у всех там лежит включая твой IIS (хотя начиная с висты IIS же в отдельной сессии) и хакнул сайт?
                                          Ответить
                                          • Не...

                                            Либы злоумышленнику нужны ради небольших фрагментов кода из которых он сможет сложить свой паззл. DEP же ему не даёт напрямую код залить, приходится бомжевать.
                                            Ответить
                                            • то примерно как эти.. гаджеты или как их там про ретурн ориентед

                                              типа мне нужен код jmp по такому-то смещеню, и язнаю, что как раз в таком месте он и лежит?
                                              Ответить
                                              • Да, оно самое.

                                                На самом деле ASLR, DEP и стек протектор таки закрывают большинство тривиальных атак.

                                                Дальше уже надо код изучать, не каждый мамкин хакер за это возьмётся.
                                                Ответить
                                              • ROP-цепочки, ага: https://malwaresec.github.io/Building-the-ROP-Chain/.
                                                Ответить
                                  • а выйди и войди снова.. поменяются адреса?
                                    Ответить
                                    • Позже сделаем.
                                      Ответить
                                    • > а выйди и войди снова.. поменяются адреса?

                                      Звучит как очередная порнуха на порнхабе.
                                      Ответить
                          • Именно поэтому я за микроконтроллеры - там нет этой ебанической ссанины с MMU
                            Ответить
                            • на писи ты тоже можно отключить mmu и получить чистые сегмементы, хз правда как это в 64 работает, может что и не работает
                              Ответить
                              • В 64 mmu отключить нельзя. Разве что настроить 1:1 маппинг с RWX правами на всю память и течь.
                                Ответить
                              • Вообще-то работает, такая хуйня в TempleOS есть.

                                > TempleOS — операционная система (ОС) для персональных компьютеров платформы x86-64, поддерживающая невытесняющую многозадачность[7] и многоядерные процессоры; она имеет единое адресное пространство без ограничений доступа (есть только «кольцо 0»), без поддержки сетей, и подходит для любительского программирования
                                Ответить
                                • > Вообще-то работает

                                  Да такая хуйня с 1:1 RWX и в UEFI есть на каждой машине.
                                  Ответить
                                • https://templeos.holyc.xyz/Wb/Doc/FAQ.html

                                  > -] Where is the kernel memory?
                                  > TempleOS identity-maps all memory, all the time. It is like paging is not
                                  > used. There is no special kernel high half memory space. TempleOS is
                                  > ring-0-only, so everything is kernel, even user programs. There is a special
                                  > task called Adam and he doesn't die, so his heap never gets freed. That's as
                                  > close to kernel memory as it gets. All code goes in the lowest 2Gig of
                                  > addresses, known as the Code Heap, so that the REL32 addressing mode can be
                                  > used. See MemOverview.
                                  Ответить
                                • ну там моди есть mmu, просто одна большая страница на все?

                                  грубо гря сегменты ведь в обычных ос тоже используются: один сегмент размером со всю память для всех процессов для кода, например
                                  Ответить
                                  • > одна большая страница

                                    Одной страницей всю память не покрыть, надо всё-таки немного попердолиться с таблицей. Но да, смысл в том что после трансляции адреса не меняются (identity-map, 1:1).
                                    Ответить
                                    • тьфу, одна таблица я хотел сказать

                                      ты прав, одной страницей не покрыть память, даже если она huge page )))
                                      Ответить
                                      • Кстати, о страницах

                                        Вспомнил, как читал у Руссиновича ужасный багор про w2k: при больших объемах памяти она использовала кое-где больше страницы (по 4 метра или как-то так) чтобы не засирать таблицы страниц, и с таким уровнем гранулярности у ней код и данные оказывались вместе, и она не могла запретить write таким страницам
                                        Ответить
            • > Нахуй нужно наследование без виртуальных методов?

              В крестах наследование - это вообще какая-то ебаная хуйня. Например там есть public, private, protected наследование. https://studfile.net/html/2706/661/html_KwYFdKCAJA.BKEz/htmlconvd-UsDhyW4x1.jpg
              Зачем? Зачем?

              Лучше б сделали гомоиконы, которыми бы уже описывались сами эти классы, потом для них всякие там паблик приват протектед хуекдет и проч. методы, и всяких там ебанутых правил отнаследовать хуйню чтоб тоже можно было хоть 100500 придумать, чтоб даже можно было сказать "унаследуйся от вот этого говна, но только чтоб вот этого метода и вот этого поля класса там не было". Но нет, нихуя, лучше захардкодить в стандарт какое-то ебаное говно, непойми откуда взявшееся
              Ответить
              • >зачем?
                чтобы наследоваться в тайне от всех, например ради реализации паттерна "шаблонный метод" или ради переиспользования кода (плохой вариант)

                но для шаблонного метода нужно конечно чтобы он был виртуальным
                Ответить
      • > эффективнее

        Я думаю нет. В крестах нет какой-то магии, которую нельзя сделать на сишке при помощи копипасты, бутылки пива и какой-то матери. Даже исключения можно запилить вручную.
        Ответить
      • > Объектно-ориентированные возможности C++ часто обходятся дороже, чем «чистый Си», так как расходуют больше ресурсов

        Ну ебать. Особенно конечно стек жалко, его и так всего мегабайт.
        Ответить
        • > мегабайт

          Ой да ладно... 12-24Кб стека вполне хватает если не выёбываться с некоторыми идиомами.

          З.Ы. Это не контроллеры, если что.
          Ответить
          • зелененьким надо было
            Ответить
          • > З.Ы. Это не контроллеры, если что.

            Надо чтод DOS на IBM PC/XT. В базовой модификации там было всего 128 кб ОЗУ на всё про всё

            https://www.youtube.com/watch?v=EY8Mey846IA

            DOS, черной пеленой экран заполнил чистый DOS,
            Мышь. Потеряла форму, стала вдруг квадратной мышь,
            Я разбил окно, 95-ое мастдайное окно,
            И поставил DOS, и тогда я понял: это счастье – вот оно.
            
            Слезы на очках – странные очки, а может слезы на лице,
            DOS очистил все. Все, что было лишним у меня на диске С:,
            Я нажал F8 и веселый Нортон удалял мне все подряд –
            40 Мегабайт, может даже больше, может даже 60.
            
            И представил я: город наводнился вдруг разумными людьми!
            Вышли все под DOS, а проклятый Windows удаляли, черт возьми!
            Позабыв про Word, MS Excel, Corel Draw и прочий геморрой,
            Люди ставят DOS, словно в рай, заходят в DOS, нормальный чистый DOS.
            Ответить
            • > DOS на IBM PC/XT

              Ты будешь смеяться, но 24Кб -- это ограничение ядерных стеков Windows под x86_64 (на 32-битной было вообще 12Кб).
              Ответить
              • Это не ограничение, а какая-то фигня, которую без проблем можно обойти, выделив большой кусок через malloc и перепихнув ESP в конец этого куска
                Ответить
                • Обойти можно, там даже документированная функция для такого переключения есть. Но это геморно и не бесплатно. Поэтому большую часть времени таки приходится жить с 24Кб стека. Не то чтобы это сильно напрягало.
                  Ответить
              • "три страницы", да:))) У какого-то чувака так блог про ядровинды назывался
                Ответить
        • не только стек: деструкторы и конструкторы все равно вызываются же, другой вопрос, что ты не обязан в них что-то делать
          Ответить
          • Можно подумать ты на сишке close() и free() не вызываешь в тех же самых местах. Там не так уж много лишнего кода генерится.

            В отличие от ёбаных стрелочек в стримах. Вот что реально дорого обходится.
            Ответить
            • ну в сишке я копирую структуру, и теку
              в в крестах я должен подумать десять раз: а нету ли там тяжелого деструктора например

              но если там есть десктрутор, то значит это уже не просто тупая структура, так что подумать все равно придется

              а пустые конструткоры и десукторы ведь бесплатные, они вообще не существуют в коде?

              >ёбаных стрелочек в стримах.
              даа, я уже посмотрел на выхлоп годболта, и понял, почему гост для того примера взял printf с csdtio а не iostream
              Ответить
              • В дебаге всё платное. В релизе пустые да и просто мелкие заинлайнятся само собой (поэтому лучше их сильно не прятать если выключен lto/ltcg).
                Ответить
                • кстати, как работает сурс код дебагинг в релизных сборках, когда все заинлайжено?
                  Ответить
                  • Хуёво работает. Прыгает в рандомном порядке между функциями и строками, лол. Но это и в няшной так, просто там меньше однострочных говнофункций, поэтому не так бесит.

                    З.Ы. Хотя и в дебаге продираться через операторы шаред птров и прочую хрень тоже не особо приятно.
                    Ответить
                    • даже в джаве по лапше колбеков иногда неприятно прыгать . Особенный лулз когда тред стал на ожидании другого треда, и исполнение перешло в хуй знает куда. Но правда некоторые дебагеры умеют это внятно показать.

                      Брендан Грегг вроде пилил тулу, где у него в колоночку высраивались стеки таких вот тредов, а сверху были нативные стеки, в том числе и ядерный, правда это было для профайлера.

                      lto/ltg это как раз то, что умеет заинлайнить метод из другой единицы компиляции?
                      Ответить
    • https://tproger.ru/translations/cpp-hints/
      Общие хитрости для C++

      > 1. Макрос watch — один из самых полезных приёмов.
      Это правда удобно. Жавабляди, например, так не могут.

      >2. Другие полезные макросы:
      #define pow2(x) ((x)*(x))
      ээ
      #define mod(x, m) ((((x) % (m)) + (m)) % (m))
      ммм
      вы сейчас точно про кресты??

      >3. Не бойтесь использовать typedef.
      какая хитрость ;))

      > Никогда не используйте INT_MAX в качестве бесконечности для целых чисел

      какая математика ))

      >__gcd

      какой нейминг ))

      >Не используйте 1 << x, если x может быть больше 31

      или 15 в случае borland c 3.1?

      >вместо if(условие) x++ вы можете написать x += условие

      какой бля )))

      > Всегда компилируйте код с флагом -O2
      почему имено 2?

      >ios::sync_with_stdio(false),
      спасибо

      >Не стесняйтесь использовать глобальные переменные.
      бля !!

      >#include <bits/stdc++.h>
      это чтоб _быстрее_ компилировалось?
      Ответить
      • > почему имено 2?

        Потому что О3 часто раздувает код, а пирфоманса особо не добавляет. Короче его надо юзать в меру и по необходимости, а не как гентушки.

        А О2 - хороший, годный, сбалансированный дефолт.
        Ответить
      • > #include <bits/stdc++.h>

        Это стандартный код олимпиадников, чтобы быстрее набиралось. Это в нашей Чеховской-Кибальчеховской все-все знают.
        Ответить
      • Это советы только для олимпиадников. Расслабься.
        Ответить
      • >2. Другие полезные макросы:
        #define pow2(x) ((x)*(x))

        давайте угадаем, сколько прочитавших это ребят сделали в своем коде
        pow2(perform_heavy_computation())
        Ответить
      • > Никогда не используйте INT_MAX в качестве бесконечности для целых чисел

        А почему? Брат жив, вроде.
        Ответить
        • А сколько будет бесконечность плюс один?
          Ответить
        • Там поясняют, что в некоторых алгоритмах к бесконечности могут прибавлять что-то — и тогда будет багор.
          Подразумевается, что задача программиста — максимально быстро высрать имплементацию подходящего под задачу алгоритма, а уж как он работает и что там с чем складывается — проблема кого-нибудь другого.
          Ответить
      • >>> 3. Не бойтесь использовать typedef.
        >>>
        typedef long long ll;
        typedef pair<int, int> ii;

        Блядь, блядь, блядь! Сука, сука, сука!!!
        Ответить

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