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

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    AnsiString str = IntToHex((__int64) longvalue, 2); // 0x01020304
    
        char _c[11];
        char *ch = str.c_str();
        int len = strlen(ch);
        int _s = len;
        int j = 0;
        _c[j++] = '0';
        _c[j++] = 'x';
        while (_s >= 2) {
            _c[j++] = ch[_s-2];
            _c[j++] = ch[_s-1];
            _s-=2;
        }
        if (len == 7) {
            _c[j++] = '0';
            _c[j] = ch[0];
        }
        _c[10] = '\0';
    
        unsigned long pp;
        char *pEnd;
        pp = strtoul (_c, &pEnd, 16); // 0x04030201 - PROFIT!

    Наслаждайтесь

    Запостил: FataLL, 05 Августа 2022

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

    • Byte swap
      Ответить
    • error: cannot initialize a variable of type 'char *' with an rvalue of type 'const char *'

      ниработаит.
      Ответить
    • Смотри, как могу:
      #include <endian.h>
      // . . .
      pp = htobe32(longvalue);
      Ответить
      • да и htonl'а бы хватило, в том-то и прыщ
        Ответить
        • Да даже если натянуть сову на глобус и представить что позикса у нас нет вообще, да и код должен работать на системах любой конченности, это всё ещё решается в 4 битоёбские строчки максимум.
          Ответить
          • В последнее время разлюбил это битоебство в пользу более структурного кода.
            Хотя конечно строчек чуть больше.
            #include <cstdint>
            #include <algorithm>
            
            uint32_t bagor(uint32_t in) {
                union {
                    uint32_t u32;
                    uint8_t  b[4];
                } u = { in };
            
                std::swap(u.b[0],u.b[3]);
                std::swap(u.b[1],u.b[2]);
                return u.u32;
            }
            
            bagor(unsigned int):
                    mov     eax, edi
                    bswap   eax
                    ret
            
            https://godbolt.org/z/a9hcKxxWr
            Ответить
            • кстати, сделал через union, именно. но народ тут простых путей не ищет вообще
              str.erase( str.begin(), str.end() );
              Ответить
              • обожемой, они открыли для себя итераторы!
                А как же без сишной хуйни образца 1991-го года?
                int len = strlen(ch);
                ?

                Кстати, есть такой синдром, когда петух с СИ перелез на С++, но С++ не знает, и пишет вот такую вот хйню ручную перемежая ее классами
                Ответить
              • > кстати, сделал через union, именно.
                Зря.
                Ответить
                • а надо было?
                  Ответить
                  • через обычный int, чотбы перформансо
                    через обычный массив чтобы идеологически красиво
                    Ответить
                    • дык, юнион же как раз и позволяет и красиво присвоить, и красиво поменять, не?
                      Ответить
                      • Обращение к «неактивному» члену юниона в крестах — UB, в отличие от сишки.
                        Правильно такие вещи делать или сдвигами, или через std::memcpy() в массив и обратно, или каким-нибудь std::bit_cast. Все три способа современные компиляторы всё равно соптимизируют в один bswap.
                        Ответить
                        • У сишки тоже не всё хорошо, хотя и не так плохо

                          J.1 Unspecified behavior

                          — The value of padding bytes when storing values in structures or unions (6.2.6.1).

                          — The values of bytes that correspond to union members other than the one last stored into
                          (6.2.6.1).
                          Ответить
                        • > Все три способа современные компиляторы всё равно соптимизируют в один bswap

                          По-моему современные компиляторы вообще любое говно оптимизируют в bswap. Я вставил штук 10 разных реализаций (в т.ч. из этого треда) и они все стали bswap.

                          Кстати глянь что MSVC чудит. Это вообще ужасное тупое животное, которое ни одну идиому не восприняло.

                          >1. такие вещи делать или сдвигами
                          Сдвиги — это пирдоль, а не ЯВУ-way.

                          >2. или через std::memcpy() в массив и обратно
                          Пиздец Говно.

                          >3. каким-нибудь std::bit_cast

                          Вот именно поэтому я и люблю Кресты.
                          Был в Сишке очень простой и понятный способ даже джва: юнион и каст.

                          Пришли крестухи, усложнили всё до невозможности и начали умничать: «ой ты что, юнион же нельзя! И касты со скобочками нельзя!!»

                          «Нужно std::bagor_pidar_cast, потому что std::bagor_govno_cast, который ввели в C++11 уже задепрекейтили, а обычный std::bagor_cast кастит не так.»

                          «А вот в С++24 завезут std::bagor_govno_pidar_cast, вот самое идиоматичное.»
                          Ответить
                      • Как я понима: Union это просто способ в один ящик (размером с максимальный его член) положить какие-то данные в целях экономии.

                        Но использовать можно только один какой-то член.
                        Ты записал в ``u32``: все. Никакого b у тебя больше нету, и наоборот.
                        Куда записал -- оттуда и читай.

                        Тот факт, что ты что-то там писнул в b, не дает тебе повода думать, что в u32 что-то само собой изменилось. В реале это конечно так скорее всего, но по стандарту -- нет.

                        То, что ты пытаешься сделать, называется "type punning (каламбур типизации).

                        Компилятор может напихать паддингов как ему удобно, и у тебя нихера не сработает.

                        Причем в сишке это unspecified, то есть зависит от компиялтора, а в C++ это вообще UB, потому что соврешенно не понятно когда члены разрущаются и когда им нужно вызывать конструкторы и деструкторы
                        Ответить
            • По-моему, здесь UB. Раньше точно было, сейчас не скажу, надо смотреть, потому что были разговоры, чтобы подобное разрешить.
              Ответить
            • а не завязался ли ты тут на байтордер , пишуток?

              Алсу, вроде в юнион можно трогать только за один его член. Судьба других в этот момент неизвестна
              Ответить
              • > а не завязался ли ты тут на байтордер , пишуток?
                Да, действительно, я написал реверс бат.
                Хотя ОП сказал в комментарии «Byte swap». Так что всё ок.

                Впрочем: Исправил. Уменьшил.
                И переписал на нормальный язык:
                #include <stdint.h>
                uint32_t bagor(uint32_t in) {
                    union {
                        uint32_t u32;
                        uint8_t  b[4];
                    } u = { in };
                
                    return  u.b[3] | ( u.b[2] <<  8) | ( u.b[1] << 16) | ( u.b[0] << 24);
                }
                Ответить
                • На популярных кобенациях x86/arm clang/gcc оно идентично: bswap.
                  А вот всяким экзотическим платформам эта вареция нравится больше старой:

                  MIPS + GCC 11
                  bagor:
                          jr      $31
                          move    $2,$4
                  
                  old_bagor:
                          andi    $2,$4,0xffff
                          sll     $3,$4,8
                          srl     $2,$2,8
                          or      $3,$3,$2
                          sll     $3,$3,16
                          srl     $2,$4,24
                          srl     $4,$4,8
                          andi    $4,$4,0xff00
                          or      $2,$2,$3
                          jr      $31
                          or      $2,$2,$4
                  
                  https://godbolt.org/z/Pszro31vz
                  
                  Rasbian Stretch
                  bagor:
                          rev     r0, r0
                          bx      lr
                  old_bagor:
                          bic     r3, r0, #255
                          orr     r3, r3, r0, lsr #24
                          bic     r3, r3, #-16777216
                          orr     r3, r3, r0, lsl #24
                          bic     r1, r3, #65280
                          lsr     r2, r3, #8
                          mov     r0, r2
                          and     r2, r2, #65280
                          orr     r3, r2, r1
                          uxtb    r0, r0
                          bic     r3, r3, #16711680
                          orr     r0, r3, r0, lsl #16
                          bx      lr
                  https://godbolt.org/z/51rPhbTdc
                  
                  FRC 2020
                  bagor:
                          rev     r0, r0
                          bx      lr
                  old_bagor:
                          lsr     ip, r0, #24
                          mov     r3, #0
                          ubfx    r1, r0, #16, #8
                          bfi     r3, ip, #0, #8
                          ubfx    r2, r0, #8, #8
                          bfi     r3, r0, #24, #8
                          bfi     r3, r1, #8, #8
                          bfi     r3, r2, #16, #8
                          mov     r0, r3
                          bx      lr
                  Ответить
                  • Ещё забавный результат на 8-битном Ардуино, которому оказалось проще подвигать баты, чем прожевать 32-битный uint.

                    https://godbolt.org/z/ehcT7qKxd
                    Ответить
                    • https://godbolt.org/z/eKfG9Yonf
                      #include <stdint.h>
                      
                      uint32_t bagor(uint32_t in) {
                          return  (in >> 6*4) | ((in >> 72/9) & 0177400) | ((in << 8) & 16711680) | (in << 4*6);
                      }

                      ; Arduino Mega 1.8.9
                      
                      bagor(unsigned long):
                              call __bswapsi2
                              ret
                      Ответить
                      • компиляторы нереально умные, конечно

                        вот как он понял, что твои двигания битиков это на самом деле __bswapsi2?


                        А __bswapsi2 это небось интристснстсник какой-нито чтобы сделать правильно на кокретном цпу?
                        Ответить
                        • Так там даже особо никакой магии нет.
                          Это же не НАСТЕНЬКА.

                          >   (in >> 6*4)
                          Сфолдит к  (in >> 24)
                          
                          > ((in >> 72/9) & 0177400)
                          ((in >> 8) & 0xFF00)
                          Какой octal )))
                          
                          > ((in << 8) & 16711680) 
                          (in << 8) & 0xFF0000
                          
                          > (in << 4*6);
                          Сфолдит к  (in << 24)
                          Ответить
                      • (зевая)

                        Меня после того как они царизмы в сдвиги превратили уже мало что удивляет.

                        https://govnokod.ru/28289#comment781162

                        И да, я днём тоже игрался c godbolt и получил вызов __bswapsi2.
                        Ответить
                • > return u.b[3] | ( u.b[2] << 8) | ( u.b[1] << 16) | ( u.b[0] << 24);

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

                  геtигп  u.b[3] | ( u.b[2] <<  CHAR_BIT) | ( u.b[1] << 2*CHAR_BIT) | ( u.b[0] << 3*CHAR_BIT);
                  Ответить
                • Дядь Пи, так пользоваться юнионом в крестах — UB.
                  Ответить
                  • Кресты — гавно. Ну я подозревал конечно, потому написал символично: u.b

                    А через каст в кокозатель (char*) или (uint8_t *)?
                    Ответить
                    • в крестах не нужно через скобочки никогда ничего делать:)

                      от сортов каста проблема не уходит: если ты писнул в один мембер, то читать второй -- UB.
                      Ответить
                    • Гуест прав: почти ничего не меняется.
                      Единственное, что можно — это скастовать объект в char* и посмотреть, что там внутри лежит, но вот можно ли туда записать что-то — слишком лень выяснять. Я бы не стал.
                      Ответить
                      • Дайте пароль от ISO.
                        Ответить
                      • > можно ли туда записать что-то

                        Если standard layout и внутренние представления всех полей получатся корректными, то наверное можно?

                        memcpy() же как-то должен работать с сишными структурками.
                        Ответить
                • std::reverse(reintepret_cast<char*>(&in) , reintepret_cast<char*>(&in) + sizeof(in));

                  Гцц понял идею и заменил на bswap, шланг обосрался.
                  Ответить
                  • почому char а не uint8_t когда у пи в структуре uint8_t ?

                    Тут ты ему сокрмил два итератора: один на начало in, второй на конец, и попросил от сих до сих перевернуть, да?
                    Ответить
                    • А char это особая штука. В Стандарте (Сишном тоже) он отдельно выписан.

                      > почому char а не uint8_t когда у пи в структуре uint8_t ?
                      Потому что я лоханулся же.

                      На не 8-битных платформах не заработает. Борманд до довёл до идеала.
                      Ответить
                      • char -- да, там даже был прикол, что читать неинициализированные данные это харам, но char можно. Там конечно будет мусор, но программа не сломается

                        но я боюсь что тут не поможет
                        Ответить
                        • 1) Сайзоф измеряется в чарах.
                          2) Чар может алиаситься с любым типом.

                          Так что вроде всё ок.
                          Ответить
                  • Охуенно. Просто охуенно!

                    Причём
                    а) портабельно
                    б) один и тот же код работает для разных размеров инта
                    Ответить
                  • Шланг и на int16_t лажает, хотя цикл уже разворечивает.
                    А ГЦЦ — умница, юзает циклоняшный сдвиг.
                    Clang 14
                    _Z7bormandt:                            # @_Z7bormandt
                            mov     eax, edi
                            mov     word ptr [rsp - 2], ax
                            mov     byte ptr [rsp - 2], ah
                            mov     byte ptr [rsp - 1], al
                            movzx   eax, word ptr [rsp - 2]
                            ret
                    
                    gcc 12.1
                    _Z7bormandt:
                            rol     di, 8
                            movzx   eax, di
                            ret

                    PS> кстати я запросто отличу настоящую Бормандоняшу от подделки даже при полном совпадении ников и ав. Подделка никогда не напишет сливающий всё однострочник.
                    Ответить
                    • > Подделка никогда не напишет сливающий всё однострочник.

                      Тест Питуринга.
                      Ответить
    • Вот это то, что я называю C++/C89
      Ответить
    • uint32_t bagor(uint32_t in) {
          return  (in >> 6*4) | ((in >> 72/9) & 0177400) | ((in << 8) & 16711680) | (in << 4*6);
      }
      Ответить
      • да, так няшнее и не убшно

        Единственная нужная структура данных это uint32_t
        Ответить
    • О, сочетание встроенных и крестовых типов. Соус.
      Ответить
    • Жили-были питуз и зелибоба.
      Питуз был байтоебом, и писал такой код, который царю очень нравился.
      Зелибоба пришел в кресты из джавы, и писал всё в терминах stl и итераторов

      А компилятор всё равно сворачивал их код к одной инструкции, которая на современных процах сама всё делает.

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

        Я в своё время без особых проблем написал на Си сортировку массива фиксированного размера, которая дефолтный std::sort из крестоговна уделывала по скорости на рандомных данных. Т.е. крестопарашная стдлиба далеко не самая оптимальная, это как бы факт.

        Какую-нибудь хеш-таблицу тоже наверняка можно уделать, если захотеть
        Ответить
        • А это давно было?
          Ответить
          • В 2019 году

            https://govnokod.ru/25307#comment452812
            Ответить
          • Там вообще суть в том, что std::sort (по кр. мере который в GCC, в других компиляторах может быть другое) реализован судя по всему с предположением, что сортируемая им хуйня уже будет частично сортирована. И на совершенно несортированных данных она сливается как анскильная лалка в сравнении с некоторыми другими алгоритмами.

            Так-то вообще всяких алгоритмов сортировок довольно-таки дохуя, есть специальные гибридные алгоритмы, типа https://ru.wikipedia.org/wiki/Timsort которые и крестопарашный std::sort уделают на изначально сильно сортированных массивах хуйни.
            Ответить
        • Можно. Мы с 1024-- обсуждали альтернативные реализации хеш-таблиц, которые рвут STL в хламину.
          Ответить
          • Более того, в этих обсуждениях пришли к тому что только совсем ленивый велосипедист не сливает STL в хламину *.

            * на выбранных Царём бенчах и данных
            Ответить
            • Дай угадаю: потому что велосипедисты едут в одном потоке?
              Ответить
      • Вот именно об этом моё первое сообщение в треде.
        Байтоебство — говно, которого нужно избегать, и писать максимально понятный код.
        Просто я про std::reverse забыл. Точнее что он на массивах работает.

        > А компилятор всё равно сворачивал их код к одной инструкции

        Да вот только не везде оно так. Посмотри например выхлоп MSVC и поймёшь.
        Ответить
      • А да, еще крестопарашный вектор и прочие контейнеры не умеют юзать mremap() : https://govnokod.ru/27474#comment636502
        Ответить
        • Царь крестухов тут ебал за это ещё в 2013.

          Кстати анскилябры не поняли его мудрых слов и зачем-то Царя заминусовали. Пошёл въебал ему плюс.
          https://govnokod.ru/13180#comment181254
          https://govnokod.ru/13180#comment181179
          Ответить
        • мы уже говорили вроде почему: потому что ему важно знать двигается ли говно внутри или не двигается

          Это в сишке данные пассивны, и как в песне про навоз: "я ни с кем не дружу: где положат -- там лежу"

          А в крестах у них бывают деструкторы всякие и конструкторы мува и операторы копирования
          Ответить
          • > в крестах у них бывают деструкторы всякие и конструкторы мува и операторы копирования

            Так крестухи же в новом штандарте ввели идиому trivially movable. Или как-то так.

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

            Но опять же это нихуя не снимает проблемы питушарских крестов, о которой говорил Царь и j123123: питушарские реаллоки вектора вместо сверхбыстрого ремапа виртуальной памяти.
            Ответить
            • А аллокатор знает разве про твои триваали-хуивиали?
              Или знает?

              Или реально написать калллекцию, которая бдует мремапить чары, но явно расширяться для моево класса User?
              Ответить
              • > А аллокатор знает разве про твои триваали-хуивиали?

                Ну раз траливали, тогда можно не морочиться с сёмантикой и делать realloc памяти, а не вызывать для каждого элемента вектора дырсуктор старого + коньсуктор нового.

                Просто они обосрались как и джависты в примитивами.

                Любому же школьнику очевидно что int8_t или структы с такими простыми типами (без явных деструкторов конструкторов) можно спокойно двигать.
                Ответить
          • Вот:
            https://en.cppreference.com/w/cpp/types/is_move_constructible

            «Мы сначала усложнили донельзя, обосрались с пирформансом vector<int>, а теперь хотим обратно как в Сишке

            Потому мы ещё больше всё усложним, чтобы догнать Сишку»

            UPDATE: а похоже я ошибся, is_trivially_relocatable ещё не завезли
            Ответить
            • Только куча такого говна

              is_trivially_constructible
              is_nothrow_constructible
              is_trivially_default_constructible
              is_nothrow_default_constructible
              is_trivially_copy_constructible

              Пиздец блять.
              Ответить
            • Кал на самом деле зарыт в ООП

              Если бы не было идиотского понятия "активных" данных, а были бы отдельно структуры и алгоритмы для работы с ними, то вот этого бы всего говна не было. Никаких блядь ``is_trivially_default_constructible``, никаких реаллоков.

              А еще не было бы целого арктического гектара говна с ОРМ:
              https://blog.codinghorror.com/object-relational-mapping-is-the-vietnam-of-computer-science/

              Мухи отдельно, котлеты отдельно
              Ответить
              • Значит, концепция Active Record, которую так полюбили рубисты (когда пишешь petuh.name = 'Петя', а фреймворк тебе высирает UPDATE в СУБД) — тоже кал?
                Ответить
                • Помоему AR всё таки явно требует "Save".

                  Говно, конечно.

                  Что должен сделать ORM, когда я напишу

                  petuhs.each do |petuh|
                    petuh.kurochka.tsyplatky[42].cip_cip_cucelerim
                  end

                  ?

                  PS: И это я еще не вставил условие, типа чючялярем делать только если у ципленка поле foo равно 32
                  Ответить
                  • Так что и RAII кал получается:?

                    Альтернативы не прельщают: полностью ручное управление или gc.
                    Ответить
                    • RAII имеет смысл только для ООП
                      Для обычных структур можно говорить об инициализации нулями по умолчанию (как в го, например). Это вполне нормально, чтобы не иметь доступа к неинициализированному говну.

                      ООП с RAII лучше чем ООП без RAII (когда ты создаешь объект в хуйпойми каком состоянии и потом заполняешь его сотней сеттеров)

                      Но сам ООП очень плохо дружит с РСУБД. И, как мы видим, сильно усложняет реализацию коллекций (последнее можно конечно вылечить работая всегда по указателю (Как ЙАЖА) но тогда может соснуть пирформанс)
                      Ответить
                  • Реализовать говнопаттерн «SELECT в цикле», разумеется.
                    Ответить
                    • Конечно, и получить 127345234 запроса на страницу.

                      В джанге вот костыли есть
                      https://docs.djangoproject.com/en/4.0/ref/models/querysets/#prefetch-related
                      Ответить
                      • Интересно.

                        Какие ORM рекомендуешь посмотреть (на разных ЯП)?

                        Интересно, какие вообще бывают костыли.
                        Ответить
                        • на питухоне однозначно SQLAlchemy.

                          Там есть неимоверная круть -- гибрид --
                          https://docs.sqlalchemy.org/en/14/orm/mapped_sql_expr.html
                          которую джангоебы не осилили и до сих пор пишут ДВА раза одну и ту же логику (для питона и для SQL).

                          Из пафосной хуйни наверное Hibernate для ЙАЖА и EF для .NET

                          Там можно наблюдать интересный подход: ты описываешь декларативно питушню, а тебе по ней генерят и классы и таблицы

                          В жаве есть еще mybatis, когда ты пишешь запросы вручную, а он просто результат натягивает на объектф

                          ну и нагугли фаулеровскую Enterprise Application Architecture, там описываются все сорта ормов

                          ps: есть еще способы замапливания классов на sqlite (coredata у ябла, в андроиде тоже штук пять)

                          по сути тоже орм, как и https://metacpan.org/pod/Tie::Hash::DBD
                          Ответить
                          • > В жаве есть еще mybatis, когда ты пишешь запросы вручную, а он просто результат натягивает на объектф

                            Чем это лучше jdbc template?
                            Ответить
                    • Вот вы смеётесь, а я в джава-чате сижу:

                      всем привет, подскажите пожалуйста, как можно решить проблему)

                      есть сервис, помечен спринговой @Transactional
                      в нем метод обновления сущности, у этой сущности есть поле - табличка связей, там может быть много объектов (ссылок), есть валидация по БД, то есть каждый idшник вставляемый в это поле, сначала валидируется на наличие в БД через репозиторий.

                      Я заиспользовал parallelStream для валидации списка объектов, чтобы значительно ускорить всё это.

                      ...


                      ids.stream()
                                      .map(id ->
                                              entityRepository
                                                      .findById(id)
                                                      .orElseThrow(() -> new ...Exception(ошибка)
                                      )
                                      .collect(toList());


                      ...

                      если 3 поля распаралелить и там много idшников, то с 12-13 секунд я до 4.5 сократил
                      Ответить
                      • > Я заиспользовал parallelStream
                        > чтобы значительно ускорить всё это.
                        Кокой AssParallel )))

                        Ну Жописты теперь как их ololo-linq братья

                        https://govnokod.ru/9194

                        Спойлер: В результате бенчей AssParallel выяснилось что он замедляет кот в несколько раз
                        Ответить
                        • linq кстати пиздатая идея: статически типизированный запрос к коллекциям и к СУБД на одинаковом языке, но увы: он не взелетел видимо по причинам N+1 и проебов пифоманса
                          Ответить
                          • > linq кстати пиздатая идея
                            Да.

                            Я смотрю как они его в «JAVA» сделали и понимаю что у Майков LINQ получилось:
                            а) в пять раз удобнее
                            б) на пять лет раньше

                            >entityRepository
                            Зачем мне ваши repository? Я хочу как в Linq-to-sql прямо чтобы Where в запрос пошло.

                            >.collect(toList());
                            Нахуй мне писать это говно?

                            > но увы: он не взелетел
                            А я по общению .netчиками слышал что взлетел.
                            Ответить
                            • >нахуй мне писать
                              кстати, в koko починили. Там можно foo.map{...} и чуть ли не сразу его результат в лист положить

                              >А я по общению .netчиками слышал что взлетел.
                              наскока я опнимаю, linq-to-sql в серьезных проектах не исопльзуют: там везде EF

                              Потому что можно напистаь такой linq случайно, который будет раблотать пиздато, когда у тебя 10 записей в базе (и он породит 10 запросов)

                              А когда их станет 1000 и он породит 1000 запросов, то ты соснеш
                              Ответить
                              • А разве не наоборот?

                                Мне объясняли что Entity Framework это ORM и дохуя оверхеда генерит.
                                А ololo-linq там маппинг в sql чуть ли не 1-к-1. А в чём подвох я уже забыл.

                                > Потому что можно напистаь такой linq случайно, который будет раблотать пиздато, когда у тебя 10 записей в базе (и он породит 10 запросов)

                                А зачем ему 10 запросов?
                                > .Where<string>(s => (s.Length == 4)).GroupBy(x => x).
                                Это по идее одним запросом можно выбрать.
                                Ответить
                                • А если я такой запрос в цикле напишу?

                                  >не наоборот

                                  ````
                                  LINQ to SQL is the quick-and-easy way to do it. This means you will get going quicker, and deliver quicker if you are working on something smaller


                                  Entity Framework is the all-out, no-holds-barred way to do it. This means you will take more time up-front, develop slower, and have more flexibility if you are working on something larger.
                                  ``
                                  Ответить
                                  • > А если я такой запрос в цикле напишу?
                                    «А если я её кувалдой?»

                                    Против дурака нет защиты.

                                    А разве если обращение к EF в цикле написать оно не 1000 раз вызовется?

                                    > more time up-front, develop slower, and have more flexibility if you are working on something larger.
                                    Это какой-то маркетинговый буллщит. Не объясняется в чём именно различие.
                                    Ответить
                                    • В EF есть костыль
                                      https://docs.microsoft.com/en-us/ef/ef6/querying/related-data

                                      >Против дурака нет защиты.

                                      Ну вот начинается блядь

                                      Я не могу просто писать C# код для работы с объектами, я должен постоянно думать, во что там оно в СУБД превратится
                                      Ответить
                                      • Ну блять, если 1000 раз вызывать select в цикле. То он 1000 раз вызовется в БД.

                                        Это логично. EF не решает эту проблему.
                                        Ответить
                                        • ну вот я дал там пример рещения через предзагрузку данных

                                          потом все данные уже в контексте и можно по ним итерироваться безопасно

                                          я не уверен, что это может linq-to-sql.
                                          Ответить
                                          • > ну вот я дал там пример рещения через предзагрузку данных

                                            Честно, уже очень хочу спать, листал тред и ничего не понял.
                                            Ответить
                                            • у тебя есть питушок, у него есть курочка

                                              ты запросом выбрал 1000 петушков, идешь по ним циклом, и у каждого берешь курочку

                                              получается 1000 запросов

                                              N+1 запросов, где N -- количество петушков

                                              Для этого в ORM завезли prefetch, Include, и прочую зхуйню чтобы ты мог сказать "к петушку выбери еще и курочку". Тогда получится джойн петушков на курочек, всех выберет один запрос, результат загрузят в контекст, и ты по нему будешь итерироваться безопасно
                                              Ответить
                                              • Так linq-to-sql умеет в джойны. В чём проблема? Не понимаю.

                                                Edit
                                                Ладно, уже совсем сплю, как проснусь перечитаю.
                                                Ответить
                                      • > В EF есть костыль
                                        > https://docs.microsoft.com/en-us/ef/ef6/querying/related-data

                                        В Linq тоже есть пара костылей. И Include и опция DeferredLoadingEnabled.

                                        https://docs.microsoft.com/en-us/dotnet/api/system.data.linq.datacontext.deferredloadingenabled?view=netframework-4.8

                                        Точно то же самое что и во всех остальных ОРМах.
                                        Ответить
                      • Вот в том и пирдоль.

                        В ООП у тебя есть граф объектов в памяти, и ты императивно по нему шероёбишься. Граф всегда в памяти (там могут быть оверлеи или виртуальная памтяь, но тебе на нее похуй как прикладнику)

                        В SQL у тебя есть декларативный (обычно) запрос для нарезания в двумерное пространство каких-то таблиц (в OLAP кубах есть больше измерений, но их никто не умеет)

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

                          все мои знакомые галерщики хранят говно в РСУБД выдергивают его хибернейтом и всё время должны помнить, что они работают не просто с объектами, а с отражением СУБД
                          Ответить
                          • > нгасколько они продакшен реди

                            Они всегда будут хуже реляционок т.к. с однородными данными всегда быстрее работать, чем с разнородными...
                            Ответить
              • > Кал на самом деле зарыт в ООП
                > были бы отдельно структуры и алгоритмы для работы с ними, то вот этого бы всего говна не было.

                Очень спорно.

                ООП — нормальная концепция. И объединение контроля жизненного цикла неких данных (RAII), алгоритмов (ха-ха-ха геттеры/сеттеры) рядом со структурами, которыми они оперируют — не самая плохая идея.

                Просто Кресты всё переусложнили на ровном месте.
                Ответить
                • Ну а как бы ты сделал?

                  Как можно не пирдолица с мувабл-хуювабл кроме как всегда ложить всё в кучу и работать через указатель?
                  Ответить
                  • А пусть компилятор под капотом решает.
                    Нет конструктора/деструктора — смело можно двигать.

                    Есть — ну значит что-то нетривиальное: refcount ссылки, файлы какие-то или memory mapped.
                    Может тот вектор шарится с каким-нибудь managed enviroment вроде «Йажа» и его просто так двигать нельзя.

                    > ложить всё в кучу и работать через указатель
                    Тогда невозможны никакие абстракции вроде ARC и прочих умных указателей: vector<shared_ptr<...>>
                    Ответить
                    • М0ЩНАЯ идея какая

                      То есть я положил говно в вектор и оно там ремапица нормально
                      А потом я написил конструктор у говна, и у меня в векторе стали лежать умные указатели?

                      Чем-то похоже на ескейп анализ в момент копуляции как у го, но гораздо смелее
                      Ответить
                      • > М0ЩНАЯ идея какая
                        Не понял это сраказм или нет.

                        Ну оно в крестах и примерно так работает же.
                        Trivial move constructor
                        
                        The move constructor for class T is trivial if all of the following is true:
                        
                            it is not user-provided (meaning, it is implicitly-defined or defaulted);
                            T has no virtual member functions;
                            T has no virtual base classes;
                            the move constructor selected for every direct base of T is trivial;
                            the move constructor selected for every non-static class type (or array of class type) member of T is trivial. 
                        
                        A trivial move constructor is a constructor that performs the same action as the trivial copy constructor, that is, makes a copy of the object representation as if by std::memmove.
                        All data types compatible with the C language (POD types) are trivially movable.

                        Я же сразу сказал: крестухи как и йажисты, переизобретают Сишные примитивные типы.

                        > похоже на ескейп анализ в момент копуляции как у го, но гораздо смелее
                        Та анскильному Говну до унылой жабы ещё срать и срать. А до Крестов и подавно.
                        Ответить
                • >рядом со структурами, которыми они оперируют — не самая плохая идея.

                  Хорошая, но она плохо ложится на коллекции


                  Обернуть ресурс обхъектом чтобы его вручную не закрывать (и не делать как в ЙАЖА) -- это хорошо

                  Но вот я хочу написить res1 = res0. Что мне делать? Скопировать ресурс? Какова семнатика?

                  Можно все сделать через указатели (ну не GC, но ARC), но это проеб перформанса. Ты уже не можешь сделать vector<char> не став лалкой
                  Ответить
                  • > Ты уже не можешь сделать vector<char> не став лалкой

                    Царь об этом говорил.

                    Но трали-вали по идее и есть решение этой проблемы. А также mov-сёмантика.

                    > Какова семнатика?
                    Она зависит от того какие именно конструкторы (не) оперделены.
                    Ответить
                    • Для этого ты никогда не должен знать как ты работаешь с объектом


                      int? Значит, будем копировать
                      User, но movable? значит, будем мувать
                      User, но не мувабл? Значит, заменяем на умный указатель и пхаем на кучу

                      В С++ же ты сам явно должен выбрать между указателем и объетом

                      Можно всегда работать по указателю и не знать горя (как в йажа) но тогда поблема vector<char> появлятся
                      Ответить
                • > ООП — нормальная концепция.

                  На ГК совсем не осталось ООП'шников, раз за них сам Пи зашёл?
                  Ответить
                  • ООП нормальная концепция. Покажите лучше
                    Ответить
                    • Да, но с наследованием реализации они погорячились.
                      Ответить
                      • Если 100% кода перевести на компонентную модель, то вербозность улетит в космос
                        Ответить
              • Да всё равно были бы...

                Вот есть у тебя сишная структурка с указателями -- она уже в 90% случаев не trivially copyable, надо писать какую-то функцию, которая вложенные структуры докопирует или счётчики увеличит.
                Ответить
                • Да, но разработчик и не ждет от языка этого
                  Язык не коммитился в то, чтобы чото там ему гарантировать, и потому проблемы на концептуальном уровне нет
                  Ответить
          • > мы уже говорили вроде почему: потому что ему важно знать двигается ли говно внутри или не двигается

            Если я делаю вектор из int, очевидно что его можно двигать просто так, без всяких специальных говен (но крестоговно не осиливает такую оптимизацию). И mremap() не всегда меняет адрес хуйни, иногда он тупо довыделяет сзади, и тогда никаких хуйней для двиганья не надо вызывать т.к. адреса не меняются.
            Ответить
            • Вроде как за споосб выделения памяти отвечает аллокатор
              А может ли веткор аллокатору сказать, что у тебя Int, а не User?

              >не всегда
              еще лучше. Он там подвинет чтото под копотом и не скажет мне, а как я тогда мув вызову?
              Ответить
              • > А может ли веткор аллокатору сказать, что у тебя Int, а не User?

                Если ты под аллокатором понимаешь функцию типа malloc() или calloc() то нахуя ему это надо знать? Туда тупо передается количество байтов, которые надо выделить - и тебе или дают адрес начала с этими байтами, или NULL.

                Если ты про какие-то кишки крестоговна, то можно конечно туда подобавлять всякой хуйни, типа "если тут тип с такими-то свойствами, то можно тупо перемещать через memcpy, но если нет, то уже нет". Вот там https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1144r5.html такое говно предлагают. Т.е. аннотировать некие хуйни специальным говном, что их можно просто так копировать, и нихуя плохого от этого не будет.

                И кстати, в крестах до сих пор не сделали так, чтобы программист сам мог выдумывать всякие такие хуйни для аннотирования, которые может проверить какое-то шаблоноговно на этапе компиляции и сделать что-то на основе этого? В "D" например вот https://dlang.org/spec/attribute.html#uda

                > еще лучше. Он там подвинет чтото под копотом и не скажет мне, а как я тогда мув вызову?

                А в чем проблема? mremap() возвращает адрес начала ремапнутой хуйни. Если он тот же, значит никаких мувов вызывать не надо, вся хуйня осталась на своих местах.
                Ответить
                • >Если ты про какие-то кишки крестоговна
                  https://en.cppreference.com/w/cpp/named_req/Allocator

                  когда в вектор не влезло говно --- онпросит у аллокатора еще места как я понима
                  Ответить
              • А нафига аллокатору это знать? Тут сам вектор решит копировать, перемещать или реаллочить.

                Просто сейчас он это сделать не может т.к. у аллокаторов нету метода для реаллока.
                Ответить
                • Ты предлагаиш это говно в апи олокатора икспортировать?
                  Ответить
                  • А почему бы и нет?

                    Почти все лоу-левл реализации аллокаторов умеют в реаллок. А те что не умеют -- пусть просто не заявляют его поддержку и контейнер будет юзать обычный аллок.
                    Ответить
                  • Т.е. как-то так:

                    - Реаллочим если аллокатор умеет и тип достаточно простой
                    - Аллочим и двигаем если тип умеет перемещаться
                    - Аллочим и копируем если тип умеет хотя бы копироваться
                    - Иначе не конпелируемся
                    Ответить
                    • Предлагаю ввести понятие "стоимость оперции" для каждого конкретного класса, и пускай контейнер решает, что делать дешевле

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

                      >- Иначе не конпелируемся
                      выдаем километровые ошибки) Ну впрочем плюсарям не привыкать же: я как-то у класса сделал поле const, и сразу все сломалось
                      Ответить
                      • > я как-то у класса сделал поле const
                        ССЗБ
                        Ответить
                        • да я всё понимаю, просто жабоебскому мозгу всегда смешно, когда ты например конструктор написал или вот конст, и объект перестал влазить в контейнер
                          Ответить
                          • > просто жабоебскому мозгу всегда смешно, когда ты например конструктор написал или вот конст
                            > объект перестал влазить в контейнер

                            Ну да. В мире жабоёбов принято падать в рантайме с ClassCastException, когда что-то хочешь положить в контейнер (TreeMap).
                            В лучших традициях скриптухи.

                            Серьёзный Enter-price. Не то что смешные, глупые крестухи, у которых ошибки находятся на этапе компиляции.
                            Ответить
                            • Так это вообще современный тренд: зачем что-то проверять статически, если можно упасть в рантайме?

                              Скучные старёпры сделали XHTML и XML-based шаблонизаторы.
                              Не закрыл тэг? Получи ошибку компиляции.

                              Модные хипстеры все это XML говно нахуй выкинули, теперь о незакрытом теге можно узнать случайно, когда что-то неверно отрбразится.

                              Скучные старперы завезли SOAP, где и XML схемам генерилисб классы, а модные хипстеры заменили его на JSON over REST, чтобы
                              писать
                              foo.get("bar").get("buz").get("lal")

                              ах, там надо было baz, а не buz. Ну ничего, QA отловит.
                              Ответить
                              • > Скучные старперы завезли SOAP, где и XML схемам генерилисб классы, а модные хипстеры заменили его на JSON over REST, чтобы

                                Блять.
                                Я видел как один раз по SOAP тупо передавали String с xml, а во второй случае передавалсь строка с json.
                                Свинья везде болото найдёт.

                                >заменили его на JSON over REST, чтобы писать
                                >foo.get("bar").get("buz").get("lal")
                                Никто так не пишет.

                                Рефлексией вроде jackson оно само натягивается на DTO.
                                Сами DTO можно вынести в отдельный пакет и менять централизовано.
                                Ответить
                                • Я описываю личный травматический опыт.

                                  В какой-то момент я тусил с дотнеблядями и даже сертифицировался по второму сишапру

                                  На дворе был конец нулевых, и кругом был SOAP.

                                  Мы качали wsdl, запускали тулу, получали прокси-класс, и дергали его методы (передавая туда другие структуры , тоже сгенерированные)


                                  Потом волны говна вынесли меня в жабский хипстопрайс (это как интерпрайз, но только наколенный и молодой)

                                  Там мне быстро объяснили, что надо все делать по REST и JSON, и стали писать как я выше написал.

                                  Потом я добился хотя бы написания DTO и заполнения его кажется GSonом, но опять таки:вручную

                                  Я пытался объяснить, что это всё даунгрейд, но меня никто не слушал.

                                  Потом я еще в нескольких проектах видел тоже самое, и вот с тех пор у меня глаз и дергается
                                  Ответить
            • > Если я делаю вектор из int, очевидно что его можно двигать просто так

              Крестомразь конечно прекрасна в своей бездарности.

              Сначала они засрали вектор хуйнёй и слили как лалки весь пирформанс.

              Потом Царь их ткнул носом в говно и они ввели в С++11 std::is_pod //primitive data object или «у нас же как в Сишке»

              А что они делают в С++20? Правильно! депрекейтят std::is_pod и вводят вместо него ДВА новых концепта std::mycpp_real_is_pod и std::tralivali_copyable
              Ответить
              • Ну да, оказывается нельзя сделать универсальный контейнер, который будет одинаково хорошо работать с "char", "User" и синглтоном:)

                Оказывается, у объекта есть некоторые черты, от которых зависит поведение контейнера при работе сним, и на формулирование черт уходят годы

                Причем это же все по утячи (явных интфрейсов нет) и ты должен
                * изучить все черты
                * понять, какие из них есть у конкретно твоего класса (добавил сложный конструктор -- все черты в пизду пошли)
                * а вектор должен по чертам сделать какой-то вывод

                И только в сишке никаких черт нету, и массиву потому похуй что в нем лежит
                Ответить
                • > оказывается нельзя сделать универсальный контейнер, который будет одинаково хорошо работать с "char", "User" и синглтоном:)

                  False.
                  Они для этого зделали is_pod и прочие траливали_копи.

                  Чтобы в реализации контейнера условная Бормандоняша писала
                  если (траливали) то реаллок, если мув, то муваем, иначе копируем поэлементно, выполняя деструкторы/конструкторы.

                  Тогда крестошаблоны сгенерят джве реализации вектора, оптимизированные под каждый тип.
                  Ответить
                  • так это и есть черты же
                    https://en.cppreference.com/w/cpp/header/type_traits

                    traits -- черты по английси
                    Ответить
                    • is_same
                      (C++11)
                      checks if two types are the same

                      is_base_of
                      (C++11)
                      checks if a type is derived from the other type

                      is_convertible
                      is_nothrow_convertible
                      (C++11)(C++20)
                      checks if a type can be converted to the other type

                      is_layout_compatible
                      (C++20)
                      checks if two types are layout-compatible

                      is_pointer_interconvertible_base_of
                      (C++20)
                      checks if a type is a pointer-interconvertible (initial) base of another type

                      is_invocable
                      is_invocable_r
                      is_nothrow_invocable
                      is_nothrow_invocable_r
                      (C++17)
                      checks if a type can be invoked (as if by std::invoke) with the given argument types

                      Ну да, вместо того, чтобы предоставить какую-то тьюринг-полную питушню для инспекции типов, они насрали в стандарт кучу каких-то "is_pituz" для кучи частных случаев. И эти трейты самому добавить естественно никак нельзя из самого языка, только пропозалы в говнокомитет слать
                      Ответить
                      • > is_same (C++11) checks if two types are the same

                        Ну это похоже на наше любимое __builtin_types_compatible_p(typeof(a),t ypeof(b))

                        А остальное кучи какого-то крестоговна. Ну может is_layout_compatible ещё ничего, но тоже спорно.

                        Лучше бы действительно дали какое-то апи, чтобы можно было по обходить дерево/граф классов, смотреть его параметры, атрибуты, в каком порядке поля лежат, какие у них квалифайеры.

                        Но тогда мы приходим к... гомоиконности.
                        Ответить
                        • Рантайма захотелось?
                          Ответить
                          • Зачем? В компайлтайме же. Там почти всё для этого уже завезли кроме самой структурки, описывающей тип.
                            Ответить
                        • PRы уже есть, осталось немного подождать.
                          Примерно к 2030-му году всё должно устаканиться и можно юзать в продакшене!

                          https://isocpp.org/files/papers/n3996.pdf — рефлексия.
                          https://open-std.org/Jtc1/sc22/wg21/docs/papers/2018/p0707r3.pdf — метакласс (кодген).
                          Ответить
                          • > mirror
                            > puddle
                            > rubber
                            > lagoon

                            Наркоманы ёбаные, как людям все эти имена запоминать? 4, сука, неймспейса с ничего не говорящими названиями в одном пропозале.
                            Ответить
                            • Сочини мнемо-сказку о резиновой уточке в луже перед зеркалом.
                              Ответить
                          • > PRы уже есть, осталось немного подождать.
                            > Примерно к 2030-му году всё должно устаканиться и можно юзать в продакшене!

                            А суть та же: сектанты варятся в говне, и верят в светлое будущее: «коммунизм через джвадцать лет».
                            Уж «в новом Стандарте™ всё починят».
                            Ответить
                            • Там недавно принимали символы для этих фич. Которые пока ничего не делают.
                              Ответить
                            • > А суть та же: сектанты варятся в говне, и верят в светлое будущее: «коммунизм через джвадцать лет».

                              А при C++30 все будет заебись.
                              Он наступит скоро - надо только подождать.
                              Там все будет рефлексивно, там все будет в кайф.
                              Там, наверное, вообще не надо будет код писать.
                              Я проснулся среди ночи и понял, что
                              Все идет по плану.
                              Ответить
                              • Это охуенно!
                                Ответить
                              • Один лишь дедушка Си хороший был язык,
                                А все другие остальные – такое дерьмо,
                                А все другие языки, и такие мудаки.
                                Над родной над сишкой бесноватый UB шёл,
                                Я поставил С++ там всё тоже хорошо,
                                Там товарищ Стра Ус Труп – там #include как и у нас,
                                Я уверен, что у них то же самое
                                И всё будет по Стандарту.
                                Ответить
                              • Указателем массив переломлен пополам
                                А наш батюшка Ритчи совсем усоп
                                Он разложился на макросы и на битовый код
                                А конпеляция идёт и идёт по плану
                                Ответить
                        • На самом деле, это всё уже можно накостылить на фьюжен-подобной хуйне. Но это макросы. И надо у каждой структурки имена полей вручную перечислить (только имена, остальное по ним нормально извлекается).
                          Ответить
                      • Ебать ссанина ебаная
                        Ответить
                      • Есть какой-то известный codestyle, который запрещает использовать всё это ёбаное метаговно? Или лучше флаг сборки, чтобы оно вообще не компилировалось нахуй! Заебался я эту хуйню вычитывать после уволившегося коллеги.
                        Ответить
                        • Завидую тебе.
                          Ответить
                          • Во-ко-ко-ко-ко-кансия ещё свободна. Нужен С++/Python/Goвно разработчик. Интересует? Пиши в личку.
                            Ответить
                      • is_pointer_interconvertible_base_of




                        Да блядь
                        Ответить
                • Джаваблядь видно за верстух
                  Ответить
      • Один раз Рейтуз уединился с зелибобой и ему подфортило ощутить вкус своих же фекалий.
        Ответить
    • Ладно, расчехлил я свои порядком заржавевшие кресты и сделал как надо.
      https://gcc.godbolt.org/z/KqaYv8dPz
      #include <array>
      #include <algorithm>
      #include <cstdint>
      #include <numeric>
      
      template<typename T>
      concept Integral = std::is_integral_v<T>;
      
      template<typename T>
      concept Unsigned = std::is_unsigned_v<T>;
      
      template<typename T>
      constexpr T bswap(T value) requires Integral<T> && Unsigned<T> {
          using InspectType = std::array<std::uint8_t, sizeof(value)>;
      
          auto temp = std::bit_cast<InspectType>(value);
          std::reverse(std::begin(temp), std::end(temp));
          return std::bit_cast<T>(temp);
      }
      
      // Explicit instantiation, for illustrative purposes only
      template std::uint8_t bswap<std::uint8_t>(std::uint8_t);
      template std::uint16_t bswap<std::uint16_t>(std::uint16_t);
      template std::uint32_t bswap<std::uint32_t>(std::uint32_t);
      template std::uint64_t bswap<std::uint64_t>(std::uint64_t);

      unsigned char bswap<unsigned char>(unsigned char):
              mov     eax, edi
              ret
      unsigned short bswap<unsigned short>(unsigned short):
              mov     eax, edi
              rol     ax, 8
              ret
      unsigned int bswap<unsigned int>(unsigned int):
              mov     eax, edi
              bswap   eax
              ret
      unsigned long bswap<unsigned long>(unsigned long):
              mov     rax, rdi
              bswap   rax
              ret
      Ответить
      • Что характерно, на -O2 «gcc» обосрался на специализации для uint64 и выдал портянку. На -O3 исправился.
        А вот «clang» сливается в хламину даже с -O3:
        [вырезано для 2000 символов]
        unsigned int bswap<unsigned int>(unsigned int):                       # @unsigned int bswap<unsigned int>(unsigned int)
                mov     dword ptr [rsp - 4], edi
                mov     eax, edi
                shr     eax, 24
                mov     byte ptr [rsp - 4], al
                mov     byte ptr [rsp - 1], dil
                lea     rax, [rsp - 2]
                mov     rcx, rax
        .LBB2_1:                                # =>This Inner Loop Header: Depth=1
                movzx   esi, byte ptr [rax - 1]
                movzx   edx, byte ptr [rcx]
                mov     byte ptr [rax - 1], dl
                mov     byte ptr [rcx], sil
                add     rcx, -1
                lea     rdx, [rax + 1]
                cmp     rax, rcx
                mov     rax, rdx
                jb      .LBB2_1
                mov     eax, dword ptr [rsp - 4]
                ret
        unsigned long bswap<unsigned long>(unsigned long):                       # @unsigned long bswap<unsigned long>(unsigned long)
                mov     qword ptr [rsp - 8], rdi
                mov     rax, rdi
                shr     rax, 56
                mov     byte ptr [rsp - 8], al
                mov     byte ptr [rsp - 1], dil
                lea     rax, [rsp - 2]
                lea     rcx, [rsp - 6]
        .LBB3_1:                                # =>This Inner Loop Header: Depth=1
                movzx   esi, byte ptr [rcx - 1]
                movzx   edx, byte ptr [rax]
                mov     byte ptr [rcx - 1], dl
                mov     byte ptr [rax], sil
                add     rax, -1
                lea     rdx, [rcx + 1]
                cmp     rcx, rax
                mov     rcx, rdx
                jb      .LBB3_1
                mov     rax, qword ptr [rsp - 8]
                ret
        Ответить
        • А MSVC можно как-то заставить генерить нормальный код не прибегая к интирсикам и асмовставкам?
          Ответить
          • Вряд ли.
            Ответить
            • А чего зелёным?

              bswap на ардуино я получил довольно быстро.

              А вот с MSVC пирдолился-пирдолился, но так и не смог выжать из него более-менее адекватный выхлоп.

              Может там есть какие-то особые флаги. Я пробовал /O2 и /Og.
              Ответить
          • В 64-битном MSVC даже асмовставки не поддерживаются. Только линковаться с отдельным obj-файлом. Или делать инъекцию массива из опкодов.
            Ответить
        • Фух, Наконец-то Шланг победил.

          А разгадка проста: Кресты — гавно. std:: reverse нахуй
          Ответить
      • ДА ПОШЁЛ ТЫ НАХУЙ!!!
        Ответить
      • Переведи на пхп, мы не обязаны понимать крестометапарашу.
        Ответить
        • <?php
          function bswap32($value) {
              $bytes = pack("N", $value);
              $bytes = strrev($bytes);
              $v = unpack("N", $bytes);
              return $v[1];
          }
          
          echo dechex(bswap32(0x11223344));

          https://onlinephp.io/c/7cd10
          Ответить
          • тебе реально настолько нечего делать?) или где-то есть автоматический переводчик уже?
            Ответить
            • ПЕРЕВОДЧИКИ НА ПХП
              НА ПХП ПЕРЕВОДЧИКИ
              Ответить
            • Почему бы и не потратить пару минут на комментарий, раз люди просят?
              Ответить
              • переведи мне пужулуйста Энеиду Котляревского на литовский
                Ответить
                • Лучше на японский. И чтобы анимешные девочки, раз уж адаптация, а не просто перевод.
                  Ответить
                  • vanished
                    Ответить
                    • У меня личка закрыта, напиши так.
                      Ответить
                      • та там была ссылка на картинку, но ссылка такая длинная и страшная, что я испугался и удОлил
                        Ответить
          • Именно поэтому я за «PHP».
            Ответить
      • > заржавевшие

        На раст что ли ушёл?
        Ответить
        • Нет, просто давно уже не погружался.
          Ответить
          • А кто теперь будет стандарты цитировать?!
            Ответить
          • ушел в разработку на PHP?
            Ответить
            • Да если бы на «PHP»…
              Ответить
              • а на что?
                Ответить
                • На «IDA Pro», «x64dbg», «Am29000», «Python» и стандарты 1975-го года. И если первые три были интересными, то копаться питоном в древнем бинарном дерьме заебало.
                  Ответить
                  • Представил себе такую ситуацию:

                    "Вот у нас есть система 1984-го года, надо бы ее переписать на современные технологии, но никто не понимает, как она работает, так что пускай нам Gost скажет"
                    Ответить
                    • А оно примерно так и есть: вот у нас есть система 199X года без документации, исходников и производителя, надо её заставить работать.
                      Ответить
                  • не понял, ты фронтэндер или бекендер?
                    Ответить
                  • Одна из неназываемых контор, о которых на собеседовании не хотят рассказывать?
                    Ответить
                    • ну ты еще звание спроси
                      Ответить
                    • Нет, гражданка. Допуск подписывать меня можно заставить только паяльником.
                      Ответить
                    • «Почему у Вас резюме пропуск в семь лет?»
                      Ответить
                      • Самый стёб, что там только названия не было, а даты и т.п. были. Челу надо было написать [данные удалены].

                        Пропуск никто бы и не заметил.
                        Ответить
                        • тогда лучше nda и отмахиваться несуществующей бумажкой

                          обычно всё-таки с той стороны тоже не такие уж идиоты сидят
                          Ответить
                          • А разве кому-то не похуй на пропуски в резюме, особенно в середине списка?

                            Ну фрилансил чел или работал в чёрную где-то. Имхо не повод справки требовать.
                            Ответить
                            • я, как человек у которого есть пропуски в резюме, могу сказать, что нет, не похуй
                              Ответить
                              • Х.з. мне бы похуй было.

                                Если в самом конце -- то, конечно, возникают вопросы не отстал ли от жизни и не проебал ли все скиллы. А в середине кого вообще ебёт?

                                З.Ы. Ответ "фрилансил" не прокатит?
                                Ответить
                                • ну вдруг ты настолько токсичный, что тебя долго никуда не брали
                                  Ответить
                                  • > настолько токсичный, что тебя долго никуда не брали

                                    Мне кажется, настолько токсичных видно сразу.
                                    Ответить
                                    • >Мне кажется, настолько токсичных видно сразу.

                                      Приходит к тебе на собеседу чувак, и говорит: "а чего у тебя аватарка бабья? ты пидор что ли?"
                                      Ответить
                                      • – А чо ты без камеры?... Ой бля, лучше выключи назад
                                        Ответить
                                        • Ебать ты токсик )))
                                          Ответить
                                          • – Ща я людей высажу и сразу Ваш связный список разверну!
                                            Ответить
                                        • Или например тян приходит на собеседование, а ты такой

                                          --ниче такая.. а тебе муж работать-то разрешает?
                                          --???
                                          --ну чоты, я просто хотел узнать, если у тебя мужик
                                          Ответить
                                • 2010-2012: Программист С++ ООО "вектор"
                                  2012-2018: Продавец-консультант Эйвон ООО "вектор-сервис"
                                  2018-2022: Программист С++ ООО "вектор-плюс"
                                  Ответить
                                • > Ответ "фрилансил" не прокатит?
                                  – ты чо, про такое в приличном обществе вообще не говорят
                                  Ответить
                                  • > про такое в приличном обществе вообще не говорят

                                    Бля, а я говорила )))
                                    Ответить
                                    • Фу, смени аватарку, заебал(а).
                                      Ответить
                                      • не стоит вызывать эту API на ПК со слабой оперативкой.
                                        Ответить
                                  • У большинства людей фриланс ассоциируется с установкой вордпресс на шаред хостинг за десять долларов.

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

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

                                        Олимпиадники тоже в эту категорию попадают, кстати.
                                        Ответить
                                        • у олимпиадника есть околоматеатический бекграунд что выгодно его отлиает от фрилансера
                                          Ответить
                                      • > по-другому он уже не сумеет

                                        Если этот фриланс стоит в начале или середине карьеры, а потом идёт пара лет в нормальных конторах, то не похуй ли? Скорее всего уже сумел.
                                        Ответить
                                        • та начало и середину карьеры можно вообще из резюме убрать
                                          Ответить
                                      • Ещё есть мнение, что у фрилансера просто отсутствует какой-либо фидбек: ему никто не скажет, что вот в этой вот строчке у тебя UB, тут говно, этот модуль вообще пиздец, здесь ты, ебанат, написал квадрат, там технология хуёво применена, эта либа не нужна, то нужно отдать либе, а не велосипедить, так вменяемые люди не пишут — и так далее.

                                        Как следствие — в профессиональном плане фрилансер или не растёт, или растёт, но очень туго. По сути, единственное, чем фрилансер отличается от студента с пет-проектами — у фрилансера есть опыт общения с заказчиками и работы с требованиями.
                                        Безусловно, это тоже очень важный и полезный скилл, но куда более важен он для каких-нибудь аналитиков или PMов, а от программистов всё же в первую очередь ждут умения писать качественный код.

                                        о справедливости судить не берусь
                                        Ответить
                                        • что это за код, о котором я каждый день слышу на работе?
                                          Ответить
                                        • Я бы сказал, что работать в одиночку вообще вредно

                                          Нужно работать с коллегами, причем чтобы эти коллеги были местами скилловее тебя, и ебли тебя на ревью


                                          Если ты сам себе коллега, то можешь всю жизнь писать один rotoeb.php, и на все сайты его выкладывать, и считать себя заебись программистом
                                          Ответить
                              • я как человек, маркировавший резюме с пробелами желтым флагом, могу сказать "извините"
                                Ответить
                                • ты поссал на него что ли?)))
                                  Ответить
                                  • yellow flag это как red flag только другого цвета
                                    Ответить
                                    • Red flags, May Day, there's gotta
                                      be a better way
                                      Red tanks, mass graves, Red liars always get their say
                                      Cos the only good commie is a dead commie, it's about time we learned
                                      That the only time our people are gonna taste freedom's when the last Red flag
                                      is burned

                                      https://yewtu.be/watch?v=FM3BruL_B-Y
                                      Ответить
                            • Нам по SQL давали задачку: есть продавцы, у каждого есть несколько временных лицензий (дата_от и дата_до). Нужно написать запрос, который ищет тех, у кого в лицензиях есть пропуски.
                              Мы написали трехэтажный запрос и гордо представили преподу. А он говорит: а вот на императивном языке это был бы один цикл.

                              Оказывается, вот к чему это было.
                              Ответить
      • > сделал как надо

        В принципе это бормандоняш-код. Только с флагом -pedantic и тайпчекингом целых/беззнаковых.

        > std::array<std::uint8_t
        А поцчему не char? Мы же выше установили что это непортабельно
        Ответить
        • Привычка.

          И с убранным потенциальным UB — я не уверена, что инт можно трогать через реинтпретнутый указатель.
          Ответить
          • А в чём разница между этими кастами? Зачем их столько?

            Они уже три каста завезли. Зачем вводить очередной std::mycpp_real_bitexact_cast ?
            Ответить
            • ахахах, наслаждаййся
              https://stackoverflow.com/questions/53401654/c20-bit-cast-vs-reinterpret-cast

              reinterpret_cast is forbidden in constexpr functions. One of the explicit goals of bit_cast is to be able to do these sorts of things at compile-tim
              Ответить
              • Читаю.
                Сперва вроде всё логично: не хотим ломать поведение (хотя когда их это останавливало).

                Потом начинаются перлы:
                > Now, you could say that you could just extend this specific usage of reinterpret_cast to constexpr contexts. But that makes the rules complicated.

                Блять!!! Меня восхищает эта манера крестоблядей оправдывать очередное усложнение, иначе всё станет complicated.

                UPDATE
                Дочитал. На поверхности всё выглядит логично и правильно.
                Но я же интуитивно чую это иезуитское манипулирование.
                И оно же всегда так: прикрываясь благими намерениями в С++ завозят пиздец ещё большей сложности.
                Ответить
              • почему не назвалм reinterpret_real_cast? reinterpret_cast2? reinterpret_cast_ex??
                Ответить
              • Тут кроме constexpr ещё важный момент: мы не мутируем существующее по ссылке/указателю, а копируем в новое.

                > constexpr To bit_cast( const From& from )

                Что красиво с точки зрения немутабельности/алиасинга и я сам не люблю питушню с сайд-эффектами.

                bit_cast это никакой не каст, а обычная обёртка над мемсру.

                На очень умных компиляторах он поймёт что const From& from больше не используем и каст схлопнется в noop/mov.
                А на не очень умных будут дёргаться либцовая мемсру или выполняться кучи говна, что мы и видели на примере clang.

                Гост в принципе об этом всём уже сказал здесь (просто я не конца понял):
                https://govnokod.ru/28319#comment783986
                Ответить
                • Да, я мутно выразился и забыл прямо упомянуть, что он действительно возвращает новый объект, а не даёт ссылку на старый.

                  > bit_cast это никакой не каст, а обычная обёртка над мемсру.
                  Да, с нябольшим нюансом: memcpy() нельзя использовать в constexpr-функциях, а bit_cast можно. Так что теперь в компайл-тайме можно закодить «fast inverse square root»!
                  Ответить
            • Потому что strict aliasing rule: компилятор считает — по Стандарту, — что к объекту (не в ООП-смысле, а в крестовом) типа A нельзя обратиться через указатель типа B* — и на этом строит всякие там оптимизации.
              Однако иногда так делать всё-таки нужно: например, чтобы флоат в инт превратить и биты ему подрочить.
              std::bit_cast — это решение проблемы: он позволяет, буквально, «взять битики объекта from и сделать из них объект to» — так же, как это делают запрещённые хаки с реинтпретом, но без сопутствующего UB.
              Ответить
              • То есть они сначала херят Сишную функциональность, делая UB все сорта хаков через юнионы и касты.

                Потом понимают что она таки нужна, и завозят её «в новом Стандарте™».

                Зачем? Зачем?
                Ответить
          • > И с убранным потенциальным UB — я не уверена, что инт можно трогать через реинтпретнутый указатель.

            Whenever an attempt is made to read or modify the stored value of an object of type DynamicType through a glvalue of type AliasedType, the behavior is undefined unless one of the following is true:

            AliasedType and DynamicType are similar.
            AliasedType is the (possibly cv-qualified) signed or unsigned variant of DynamicType.
            AliasedType is std::byte, (since C++17) char, or unsigned char: this permits examination of the object representation of any object as an array of bytes.


            Хопа! А через char всё-таки лучше. Так что у бормандоняшки UB быть не лолжно.
            Ответить
            • Да, я про > this permits examination of the object representation of any object as an array of bytes и писал.
              Но тут слишком мутно написано — непонятно, они только показывают или продоют читать через байтики разрешают, или писать тоже можно: надо читать Стандарт.
              Ответить
              • Мне кажется, что при standard layout и правильном внутреннем представлении полей должно прокатить.

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

                З.Ы. Вот указатели переворачивать или в бул пихать 42 -- это явно UB.
                Ответить
            • char вообще пиздатый тип: Он всегда выглядит одинаково, и к нему всегда можно обращаться

              А в какой-нить int32 может зависеть от байтордера, может по разному изображать отрицательные числа (хотя на самом деле никто так не длеает), наконец процессарь может не разрешать обращаться к конкретному байту по невыравненному адресу, и когда ты попытаешься реинтерпретировать in32 как пачу чаров и считать третий, процессор закоротит, загорится, комп расплавится, от компа загорятся занавески, от занавесок вспыхнет ковер и деревянные двери, и вот чисто из желания спасти человеческие жизни авторы стандарта и не разрешщают наверное в инты ходить как в битовые помойки
              Ответить
              • > char вообще пиздатый тип: Он всегда выглядит одинаково, и к нему всегда можно обращаться

                Да. Только название хуёво выбрали.
                Именно поэтому я за std::byte
                Ответить
    • Админил сеть из примерно 15 000 хостов, целиком покрывающую территорию трёх стран. Зарабатывал программированием на пятнадцати языках. Тринадцать лет руководил службами ИТ. Сейчас проектирую архитектуру банковских систем.
      Дата рождения
      21 января 1983
      https://habr.com/ru/users/sergey-gornostaev/

      [quote]
      Я за 22 года в отрасли столкнулся только один раз с требованием иметь вышку. Это было на заре карьеры, когда пытался устроиться админом на АТС в Иркутске.
      [/quote]
      Ответить
      • > требованием иметь вышку
        > устроиться админом на АТС

        Правильно, а как без вышки провода на столб вешать? Хотя у таких контор обычно своя есть.
        Ответить
        • А чего сразу столб? Там может быть ATM во все дыры и MPLS

          > своя есть.
          22 года назад своя сеть была даже у турфирмы
          Ответить
          • > А чего сразу столб

            А зачем вышка если нет столбов?
            Ответить
            • ты так тонко пошутил, а я тупой
              Ответить
              • Вспомнился анекдот.
                Два солтада поспорили:
                -Спорим, я сейчас вобью этот дюбель в броню танка?
                -А давай.

                Солдат начал вбивать лбом гводь, вбил наполовину, а дальше - никак. И вот он говорит товарищу: погляди-ка, что там такое твердое, что я не могу пробить?
                Посмотрел солдат - а в танке спит прапорщик Васильев.
                Ответить
    • Переписал на язык для белых людей (Сишку)
      И Шланг наконец-то повержен.
      https://godbolt.org/z/eq4PshYov
      
      void reversef(char* begin , int count) {
          while (count>0) {
              swap(char, begin[0], begin[count]);
              begin++; count-=2;
          }
      }
      
      uint64_t rev_uint64_t ( uint64_t in) { reversef((char*)&in, (sizeof(in)-1)); return in; };
      uint32_t rev_uint32_t ( uint32_t in) { reversef((char*)&in, (sizeof(in)-1)); return in; };
      uint16_t rev_uint16_t ( uint16_t in) { reversef((char*)&in, (sizeof(in)-1)); return in; };
      
      rev_uint64_t:                           # @rev_uint64_t
              mov     rax, rdi
              bswap   rax
              ret
      rev_uint32_t:                           # @rev_uint32_t
              mov     eax, edi
              bswap   eax
              ret
      rev_uint16_t:                           # @rev_uint16_t
              mov     eax, edi
              rol     ax, 8
              mov     word ptr [rsp - 2], ax
              ret
      rev_int:                                # @rev_int
              mov     eax, edi
              bswap   eax

      Да и гцц на 64 битах стал вменяемый bswap делать, а не питушню.

      А я вынес важный урок: как не нужно делать.
      Ответить
      • Хм, а нахуя там мув на стек в 16 битной версии?
        Ответить
        • Х.з. может какой-то алиасинг инта. Мы же по указателю меняем.
          Старые версии шланга более однородны :)
          rev_uint64_t:                           # @rev_uint64_t
                  mov     rax, rdi
                  bswap   rax
                  mov     qword ptr [rsp - 8], rax
                  ret
          rev_uint32_t:                           # @rev_uint32_t
                  mov     eax, edi
                  bswap   eax
                  mov     dword ptr [rsp - 4], eax
                  ret
          rev_uint16_t:                           # @rev_uint16_t
                  mov     eax, edi
                  rol     ax, 8
                  mov     word ptr [rsp - 2], ax
                  ret
          rev_uint8_t:
          Ответить
      • Изаин нотиии нпуз1
        Ответить
    • Бсвоп через строку проще на петоне написать. И смеяться никто не будет
      Ответить
    • Ура! Специальная олимпиада!
      |.&.(256&#.^:_1) 16b01020304
      Ответить

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