1. Си / Говнокод #19376

    −47

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    /* optimized division by 16 */
    n >>= 4
    
    /* optimized remainder by 16 */
    k &= 0xF

    И такой prematurely optimized хуеты в кодобазе ОЧЕНЬ МНОГО.

    Запостил: codemonkey, 01 Февраля 2016

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

    • / и % оптимизируются компилятором для целых чисел и степеней двойки?
      Ответить
      • Да, даже с -O0.

        Disassembly of section .text:
        
        0000000000000000 <main>:
           0:   55                      push   %rbp
           1:   48 89 e5                mov    %rsp,%rbp
           4:   48 83 ec 20             sub    $0x20,%rsp
           8:   89 7d ec                mov    %edi,-0x14(%rbp)
           b:   48 89 75 e0             mov    %rsi,-0x20(%rbp)
           f:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
          16:   b8 00 00 00 00          mov    $0x0,%eax
          1b:   48 8d 55 fc             lea    -0x4(%rbp),%rdx
          1f:   48 89 d6                mov    %rdx,%rsi
          22:   48 89 c7                mov    %rax,%rdi
          25:   b8 00 00 00 00          mov    $0x0,%eax
          2a:   e8 00 00 00 00          callq  2f <main+0x2f>
          2f:   8b 45 fc                mov    -0x4(%rbp),%eax
          32:   89 c2                   mov    %eax,%edx
          34:   83 e2 0f                and    $0xf,%edx
          37:   8b 45 fc                mov    -0x4(%rbp),%eax
          3a:   89 c1                   mov    %eax,%ecx
          3c:   c1 e9 04                shr    $0x4,%ecx
          3f:   b8 00 00 00 00          mov    $0x0,%eax
          44:   89 ce                   mov    %ecx,%esi
          46:   48 89 c7                mov    %rax,%rdi
          49:   b8 00 00 00 00          mov    $0x0,%eax
          4e:   e8 00 00 00 00          callq  53 <main+0x53>
          53:   b8 00 00 00 00          mov    $0x0,%eax
          58:   c9                      leaveq 
          59:   c3                      retq
        Ответить
    • // я оптимизироваль
      n >>= 4
      Ответить
    • "это не бага, это фича"
      в еmbedded такую хуйню поймет каждый без словоря, вроде паттерна

      а если это не еmbedded то звиняйте, действительно гавно
      Ответить
      • то есть средний embedded кодер по дефолту должен нормально понимать обфусцированный код, который для всех остальных говно?
        Ответить
        • Да, средний embedded кодер спокойно читает эту битовую магию, т.к. видит её каждый день.

          Там просто компиляторы хуёвые и старые бывают, которые оптимизациям не обучены... И написав x *= 16 или, о ужас, x /= 16 ты для некоторых контроллеров (не будем показывать на них пальцем) рискуешь получить софтверную эмуляцию, которая все тайминги распидорасит.
          Ответить
        • Я чо-то не понял. Ты это сдвиги говном назвал?
          Ответить
          • Если семантика подразумевает именно умножение и деление, а не операции над битами - да, говно.
            // буратино купил 5 яблок по 16 рублей за штуку
            int sum = 5 << 4;
            Ответить
            • Ещё и неконсистентность стрелок.
              // буратино купил яблоко за 5 рублей и грушу за 4 рубля
              int sum = 5 < 2; // не 9
              Ответить
              • чё
                Ответить
                • Я предположил, что << - это наклоненные стрелки Кнута, соответствующие гипероператору самого высокого порядка в выражении.
                  Поскольку a << b = hyper(a, 2, hyper(2, 3, b)), логично предположить, что a < b = hyper(a, 1, hyper(2, 2, b)). Но C какой-то неконсистентный. Не знаю, как вообще кто-то может писать на языках с подобными операторами.
                  Ответить
            • Да это-то понятно. Но ты это видел?! Ты видел? Он сдвиги говном называет.
              Ответить
            • Но в компиляторе 91 года под процессор 86 года сдвигами получается быстрее.
              Ответить
    • Зависит от смысла. Если смысл деление, то да, хуета. Если смысл именно выделение битов, то так и надо.
      Но бля, есть культисты карго, которые цвет на ргб раскладывают именно делениями. Потому что им училка же сказала, что сдвиги это предварительная оптимизация и это плохо, а своего мозга понять, когда именно это плохо - нету.
      Ответить
      • Смысл именно блять деление, так пишет Таймс коммент.
        Ответить
      • а через структуру разложить?
        Ответить
        • >Everything about fields is implementation-specific.

          Не-не-не.
          Ответить
          • В RGB888 битовые поля не нужны. А вообще да, бывает же RGB565 или YUV422 какой-нибудь.
            Ответить

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