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

    +1000

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    uint16_t swap_bytes(uint16_t a){
      uint16_t tmp = *((uint8_t*)&a+1);
      *(((uint8_t*)&tmp)+1) = *((uint8_t*)&a);
      return tmp;
    }

    Запостил: radmir, 28 Июля 2015

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

    • Красиво.
      Ответить
    • Будет очень медленно работать. Вместо работы с регистрами будет работа с памятью, да еще и побайтовая.
      Ответить
      • Без оптимизации — да.

        А с оптимизацией творятся чудеса. gcc и icc с ключом -O2 вставляют сдвиг, но при этом ещё работают с памятью:
        swap_bytes(unsigned short):
        	movl	%edi, %eax
        	shrw	$8, %ax
        	movw	%ax, -2(%rsp)
        	movb	%dil, -1(%rsp)
        	movzwl	-2(%rsp), %eax
        	ret


        Шланг вовсе обходится без работы с памятью:
        swap_bytes(unsigned short):                        # @swap_bytes(unsigned short)
        	rolw	$8, %di
        	movzwl	%di, %eax
        	retq


        P.S. Кто такой DIL?
        Ответить
        • > Кто такой DIL
          Как AL, только для DI. В x86_64 добавили.
          Ответить
          • Но при этом DIH, SIH, BPH и прочие с -H не добавили. Зато добавили ненужный SPL.
            Ответить
            • Добавишь DIH - начнут просить всякие DIHL, DIHH для старшей половины... Поэтому остановились на минимуме.
              Ответить
              • Инструкции для старшей половины регистра удобны тем, что позволяли обходиться без сдвига на 8.

                Если сделать инструкции для старшей половины 32- и 64-битных регистров, то также сдвиги на 16 и на 32 станут не нужны.

                А если вообще представить основные регистры как массив 8-, 16- и 32-битных чисел, то в некоторых случаях отпадёт надобность в непонятных расширениях типа SSE.
                Ответить
            • > ненужный SPL
              А может я стек не юзаю, и RSP для меня - регистр общего назначения?
              Ответить
    • uint16_t swap_bytes(uint16_t a) {
      return (a << 8) | (a >> 8);
      }
      Ответить
    • Где здесь c++, radmir? А вот где:
      template <typename T>
      void swap_bytes(T & value)
      {
          char * p = reinterpret_cast<char*>(&value);
          std::reverse(p, p + sizeof(T));
      }
      Ответить
    • Его тут нет, просто категория с кодом на СИ почти пустая, решил загрузить сюда.
      Ответить
      • А надо было пополнять коллекцию
        Ответить
        • будем работать над этим
          Ответить
          • пиши говно на си во славу говнокода!
            Ответить
            • Каждый раз, когда ты пишешь говно на си, умирает котёнок.
              Ответить
              • бородатый котенок
                Ответить
                • Бородатый козлёнок.
                  Ответить
                  • умирает бородатый слоненок аллюзия на импотенцию
                    Ответить
                    • Каждый раз, когда ты пишешь говно на си, умирает страус. А его труп пишет с++.
                      Ответить
                      • Коммент про Петросяна.
                        Ответить
                      • к сожалению поздно пить боржоми - С++ уже написан а труп проживет еще лет 15-20
                        Ответить
                      • http://lurkmore.so/images/thumb/d/d8/Shinji_ivan.jpg/800px-Shinji_ivan.jpg

                        Знакомая ситуация
                        Ответить
    • По большому счету, нынче все операции с указателями по определению являются говнокодом ;)
      Ответить

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