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

    −22

    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
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    // UNALIGNED only for IA64 (Itanium) 
    // for AMD64 & i386 this not needed
    
    void * c_memmove(void *dest, void const *src, size_t n)
    {
      void *ret = dest;
    
      if (n)
      {
    
        (__int8 *&)dest += n;
        (__int8 *&)src += n;
    
        switch (int x = n % 4)
        {
          do
          {
            if (!!'true')
            {
              case 0:
                *--(UNALIGNED __int32 *&)dest = *--(UNALIGNED __int32 *&)src;
                n -= 4;
            }
            else
            {
              case 3: 
                *--(__int8 *&)dest = *--(__int8 *&)src;
              case 2: 
                *--(__int8 *&)dest = *--(__int8 *&)src;
              case 1: 
                *--(__int8 *&)dest = *--(__int8 *&)src;
              n -= x;
            }
          } while (n);
        }
      }
      return ret;
    }

    Запостил: 63F45EF45RB65R6VR, 17 Мая 2012

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

    • Капец. Мало того что код слишком замудрый, так ещё на перый взгляд реализует memcpy, а не memmove.
      Но вообще в таких слуаях код для каджой архитектуры пишется свой.
      Ответить
      • показать все, что скрытокстати это заблуждение реализует он именно memmove даже на первый взгляд так как копирует с конца
        Ответить
        • если dest < src и src - dest < n, то данные будут повреждаться, ибо в этом случае копировать надо начинать с начала. При условии, что функция претендует на универсальность, конечно.
          Ответить
          • не хватает restrict для указателей, если б это был C99 конечно
            Ответить
          • охренеть этому коду уже сто лет и за все это время я не заметил в нем этот жучок
            Ответить
            • ох
              http://govnokod.ru/8495#comment119288
              Ответить
            • Угу, memmove анализирует source и dest указатели и в зависимости от их значений копирует либо в прямом, либо в обратном порядке.
              А тут чисто копирование в обратном порядке. Этакий недоделанный memmove.
              Ответить
            • Дреппера на вас нет.
              Ответить
    • http://govnokod.ru/8495
      Ответить
    • Чем стандартный не угодил? Каждый раз находится умник, который считает, что напишет намного лучше, ещё и не применяя ассемблер.
      Ответить
    • Странный код.

      Понятно, что каждый С/С++ программист обязан хотя бы раз в своей жизни применить Duff's device. Ничего зазорного в этом нет. Но что делает Duff's device здесь?

      Цель Duff's device, как известно, заключается в элегантной реализации обработки "остатка" при выполнении развертки цикла. Основная идея Duff Device - использование одного и того же кода как для обработки основной итерации так и для обработки "остатка" (засчет входа в середину развернутого кода).

      В данном же случае никакой развертки цикла не делается: во время выполнения основной итерации цикла работает отдельная ветка 'case 0:', т.е. за каждую итерацию цикла выполняется одно и только одно присваивание (пусть и "большое", т.е. 32-битное).

      Да, засчет Duff's Device тут выполняется вход в середину кода обработки "остатка", т.е. какие-то следы идеи Duff's Device прослеживаются, но это не более чем дискредитация идеи. Оно тут служит лишь запутыванию кода и все.

      Я думаю, что к такому виду этот код пришел в результате эволюционных изменений. Скорее всего, изначально тут был реализован (или хотя бы задуман) классический полноценный Duff's Device с разверткой цикла и побайтовым копированием. Потом кто-то решил его соптимизировать, заменив основную итерацию на 32-битное копирование. Это здравая оптимизация. Но вот то, что Duff's Device в этом оптимизированном варианте стал ни на фиг не нужен аффтар не заметил.

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

      Удивляет также использование 'if(!!'true')'. Это еще что такое? Milti-characher char literal?? Зачем??? Почему бы просто не написать 'if(true)'?
      Ответить
      • Ну так кто-нибудь расскажет мне, откуда взялось вот это 'if(!!'true')'? Уж неделю не сплю....
        Ответить
        • Из стандарта:
          An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.

          То есть 'true' - это int и значение зависит от компилятора.
          !! преобразует int в bool
          Возможно, пытались надурить глупый компилятор, или просто говно :-)
          Ответить
          • Что такое multicharacter literal я прекрасно знаю. Меня именно интересует, чем обосновано его использование в таком контексте.
            Ответить
            • В принципе, как уже сказал rat4, это же говнокод. И этим всё сказано.
              Ответить
    • Повcедневная жизнь cтавит пеpед нами такие зaдачки, peшaть котоpые нe учат ни в какой школе. Множество курсoв дoступны только в большиx гoродах и плaтить зa них приходится немало. Тепеpь нe нужно тратить время и деньги, мoжно получить вcё и сpaзу, пpичём абсолютно бесплатно. Школьныe уроoки, секреты кpасоты и нapодные рецепты, видеoкурcы для домашнего мacтeра, пчеловода, фотoграфа, кулинарa и т.д. Всё, на что xватит вaшей фaнтазии, cобранo в одном местe. Учиться – проcто, интерeсснo и крутo. Видеоуpоки на вcе случaи жизни: удиви друзeй – стань умнeе!

      <a href=http://mirurokov.net/page/83/>мастер класс селезнев куриные котлеты</a>
      Ответить

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