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

    +2

    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
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    #include <memory>
    #include <list>
    
    struct ListNode;
    using List = std::unique_ptr<const ListNode>;
    
    struct ListNode {
        const int data;
        const List next;
        
        ~ListNode()
        {
            if(!next)
    	    return;
    	else {
    	    std::list<ListNode*> nodes;
    	    for(auto pn = next.get(); pn->next; pn = pn->next.get()) {
    		nodes.push_back(const_cast<ListNode*>(pn));
    	    }
    	    for(decltype(nodes)::reverse_iterator in = nodes.rbegin(); in != nodes.rend(); ++in) {
    		const_cast<List&>((*in)->next).reset();
    	    }
    	}
        }
    };
    
    List Cons(int head, List tail)
    {
        return List(new ListNode{head, std::move(tail)});
    }
    
    List Nil()
    {
        return List();
    }
    
    size_t len(const List & self)
    {
        if (!self) {
            return 0;
        }
        return 1 + len(self->next);
    }
    
    #include <iostream>
    
    void test(size_t n)
    {
        auto p = Nil();
        for (size_t i = 0; i < n; ++i) {
            auto x = std::move(p);
            p = Cons(1, std::move(x));
        }
        std::cout << "done: " << std::endl;
    }
    
    int main()
    {
        test(131028);
    }

    односвязный список против джависта
    источник: https://www.linux.org.ru/forum/development/11752940?cid=11755489

    Запостил: CHayT, 22 Сентября 2015

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

    • counter terrorists win
      Ответить
    • Эээто што? Типа императивный ООП?
      Ответить
      • это просто жопа
        самое забавное, что это поциент высрал после того, как два дня всем доказывал, что у гц огромный оверхед
        Ответить
        • Ну так свое говно не пахнет
          Ответить
        • А мне показалось, "поциент" дело говорит.
          Ответить
          • т.е. компактизирующих гц не бывает, а при сборке гц должен обойти все мёртвые объекты, или что он там ещё утверждал?
            ну да, в таком мире и правда всё плохо
            Ответить
            • >компактизирующих гц не бывает
              Это что такое?
              Ответить
              • 3_14dar, иди вгугол, пидар!
                Ответить
                • >компактизирующих
                  Это по русски, пидар, пидар, пидар????
                  Ответить
            • Что двигать объекты - это дорого, например.
              Компактизирующих гц не бывает в фантазии тех, у кого удаление бесплатное.
              "Его" говнокод - не его, это он допилил как есть чужой говнокод.
              Ответить
              • да, удаление бесплатное, выделение памяти тоже
                время требуется для сканирования стеков, да на компактизацию достижимых объектов
                > "Его" говнокод - не его, это он допилил как есть чужой говнокод.
                создание второго списка(!) для удаления первого -- его изобретение
                оверхед любого самого задрипанного гц будет по всем параметрам меньше, чем у этого лютого говна
                Ответить
                • Главное - это мода.
                  Модно кричать что гц - говно. А писать хороший код - не модно. Что это за хуйня, действительно! Люди вон уже ложку для селфи придумали, а вы - писать хороший код. нонсенс!
                  Ответить
                • > создание второго списка(!) для удаления первого -- его изобретение

                  И чо, и чо? Он показал, как эту хрень удалить без рекурсии. Решение - влобное, первое попавшееся. И ещё он в курсе про то, что это говно и что в стд существует форвард_лист.

                  > да, удаление бесплатное, выделение памяти тоже

                  Я тоже так могу: в С++ удаление и выделение тоже бесплатные, время требуется только для упорядочивания аллокатора.
                  Ответить
                  • а кучу дефрагментировать твой ц++ умеет?
                    Ответить
                    • Да он её и не фрагментирует особо.
                      Ответить
                      • кучу фрагментирует не аллокатор, а программист
                        а аллокатор стоит рядом и улыбается как идиот:
                        for(int i=0; i<100; i++) {
                        	a[i] = new int[10000];
                        	b[i] = new int[1000];
                        }
                        for(int i=0; i<100; i++) {
                        	delete b[i];
                        }

                        в итоге имеем сто дырок по sizeof(int)*1000 байт
                        если после этого попытаться выделить памяти на MEM_MAX-sizeof(int)*1000, получим кукиш
                        а компактизирующий гц пошуршит, но выделит
                        Ответить
                        • fix: delete []
                          Ответить
                        • Всё это сферическая хрень в вакууме, годная лишь чтобы впаривать детям на презентациях. Если я в сишке буду 100500100500 раз выделять случайное количество байт, или освобождать случайный блок из ранее выделенных, то общий расход памяти сначала будет расти, но потом стабилизируется на некоторой цифре. Ну да, будут дырки, конечно, но не так много.
                          Если я в жабке буду много раз либо выделять случайное количество памяти, либо ээээ... забывать случайный блок из ранее выделенных, то жор памяти будет расти, пока оператива не закончится, и дырки так и будут зиять, пока гэцэшэчка не соизволит прибраться.
                          Ответить
                        • Тут на самом деле никакие гц не нужны, можно сделать хрень с двойным разыменованием. Вот например есть глобальный массив из указателей
                          void *fucingpointers[dofiga];

                          и любое обращение к массивам, выделение/освобождение памяти пусть идет через эту питушню
                          for(int i=0; i<100; i++) {
                          	a[i] = myshittymalloc(10000);
                          	b[i] = myshittymalloc(1000);
                          }

                          А потом вот если надо что-то записать/прочитать в такую myshittymalloc-нутую память, надо херачить вот такой сорт говна

                          writeshit(a[1], offset, "somedata");
                          char a[sizeof("somedata")];
                          readshit(a[1], offset, sizeof("somedata"));

                          и в этом говне читается хрень из fucingpointers[a[1]]. Т.е. сырые указатели на хип живут только в этом fucingpointers говномассиве
                          Отака хуйня, малята. И теперь если как-нибудь сильно изосрать память, чтобы там были дыры, и выделение памяти от этого обделывается, можно запускать особую хрень, которая уже пробегается по всему этому fucingpointers[dofiga] и переутрамбовывает(дефрагментирует) это все плотным куском, чтоб без дыр, при этом патча все эти адреса из массива fucingpointers.
                          Ответить
                  • > как эту хрень удалить без рекурсии
                    ~ListNode()
                    {
                        while (next)
                            next = std::move(next->next);
                    }
                    Ответить
                    • Ой, а он же const ;(

                      Ну тогда:
                      ~ListNode()
                      {
                          while (next)
                              const_cast<List&>(next) = std::move(const_cast<List&>(next->next));
                      }
                      Ответить
                  • создать список, чтобы удалить список?
                    и это ты называешь "без рекурсии"?
                    Ответить
                    • А чтобы удалить тот список, понадобится создать ещё список?
                      Ответить
                    • Да, это без рекурсии.
                      Ты до сих пор походу не догоняешь разницу между "код для примера" и "рабочий код".
                      Ответить
                  • >время требуется только для упорядочивания аллокатора.

                    Хе-хе-хе. Помню даже где-то обсуждали сортировку с O лучше теоретического, сложность уходила именно в алокатор.
                    Ответить
                    • Мне похуй, у меня свой лоликатор с О(1) и своя библиотека контейнеров под него. А ещё у меня есть
                      bool realloc_inplace (void* ptr)
                      который можно использовать в контейнерах, угадайте, что он делает.
                      Да, а стандартный realloc - дерьмо.
                      Ответить
                      • >Мне похуй, у меня свой лоликатор с О(1)

                        И как он дружит с многопоточностью? Хотел зеленым, но не буду.
                        Ответить
                        • До пизды мне гомнопоточность. Ну если будет очень надо, во все операции критсекцию вставлю.
                          Ответить
                          • Ну может лучше каждому треду свой небольшой запас, а лочить только когда этот запас пополняется или сливается в общую кучу?
                            Ответить
                      • > Да, а стандартный realloc - дерьмо.
                        Кстати, в том же dlmalloc тоже есть dlrealloc_in_place :)

                        realloc_in_place(void* p, size_t n)

                        Resizes the space allocated for p to size n, only if this can be done without moving p (i.e., only if there is adjacent space available if n is greater than p's current allocated size, or n is less than or equal to p's size).
                        Ответить
    • std::forward_list
      ну и вообще говоря, односвязные списки я в плюсах в последний раз использовал примерно никогда.
      Ответить
      • лабы не писал что ли?
        Ответить
        • Кстати, есть ещё xor linked list - джвусвязный список по цене односвязного.
          Ответить
          • И как оно устроенно?
            Ответить
            • В нодах хранится (uintptr_t)next ^ (uintptr_t)prev.

              Ну можно ещё разность, но там обход в разные стороны по-разному будет выглядеть. Неудобно.
              Ответить
              • то есть нельзя начать обход с рандомной ноды - только с хеда или тейла. ясно
                Ответить
              • ты путаешь. это std::list и есть двусвязный список по цене двусвязного. линкедлист это вообще из сишарпа
                Ответить
          • А почему никто не упомянул гибридные списки, где вместо одного элемента в узле много?
            Ответить
            • потому что это граф или частный случай графа - дерево
              Ответить
            • кнута тебе не хватает. И книги и обычного
              Ответить
              • .
                Ответить
              • Чтобы из тебя ПГМ выбивать? Или зачем?
                Ответить
                • А тебе не стыдно, что чувак с аватаркой пони с ПГМ умнее тебя?
                  Ответить
                  • Эт почему?
                    Ответить
                  • Ты дабстеп случаем не слушаешь для полноты образа?
                    Ответить
                    • а что, есть православный дабстеп?
                      Ответить
                      • Есть менее православный, но более русский DnB http://www.youtube.com/watch?v=F2Tn-pqUjY4
                        Ответить
                      • А что, есть православные пони?
                        Ответить
                    • Только такое

                      http://www.youtube.com/watch?v=BL68Sp-4Dqs
                      Ответить
                      • разве тебе не нравятся христианские рок-группы?
                        https://www.youtube.com/watch?v=koovuH7zX48
                        Ответить
                        • Как правило нет никакой (даже логической) разницы христианский рок или нет потому что практикуется в католицизме и прочая, а с точки зрения православия - что католик, что кришнаит, что атеист - еретики

                          p.s. slayer - нормальная группа.
                          Ответить
      • Только джвусвязные кольцевые с guard нодой, чтобы не париться?
        Ответить
    • Лисп говно
      Ответить
    • ну таки еще один умный новичек появился

      остается только добавить что-нить по теме:
      есть знакомый упоротый чувак и он тащит хаскилизмы в кресты:
      http://bartoszmilewski.com/2013/11/13/functional-data-structures-in-c-lists/
      https://www.fpcomplete.com/blog/2012/06/asynchronous-api-in-c-and-the-continuation-monad
      http://bartoszmilewski.com/2015/05/25/using-monads-in-c-to-solve-constraints-4-refactoring/
      и тому подобное в
      https://plus.google.com/u/0/+BartoszMilewski/posts
      Ответить
    • здорово


      ------
      <a href=http://ledpolice.ru>защита человека</a> | http://ledpolice.ru
      Ответить
    • Веб-страница вполне новых также долгожданных кинолент также мутисериалов 2017 текущего времени, также прошлых времен радо поздравляет клиента на данном ресурсе захватывающего картин к индивидуальный чувство также выбор. Ресурс публикуем только новейшие картины персонально обожаемых выпусков в доброкачественной озвучке и первоклассном виде, для того чтобы юзер нашел не обычно оценить кинокартину, но также усладиться графикой также сценарий. Сайт <a href=http://kinogolos.ru/news/dnevniki_vampira_smotret_onlajn/1-0-10>дневники вампира 8 сезон</a> профессионально совершает дублирование вышедших видеофрагментов, зарегистрировавшись в веб-ресурс, любой получает выполнимость осмотреть фильм еще до его публичного выпуска. Данная администрация создала ловкий передвижение, быстрый поиск собственно по типе, контингенту, направлению также периода сериала, выпустила достаточно популярные киноклассику также выбрали по очереди выпусков числа по сутки. Сейчас пользователи http://kinogolos.ru/ совместно из ресурсом смогут не лишь отслеживать за числом нового кино, однако еще видеть кино в аш ди версии, а плюс писать характеристики.
      Ответить
    • Лишение возможности и природной мужской твердости бывает свершиться по всякой всякой из основания, множество с каких - вовсе не правильный облик деятельности, сокрушительные повадки, расположение состояния, обостренные состояние и схожие дела, однако выздоровление возбуждения должно в любое время аккомпанировать фактичным инструментом, что за скоропостижно период отдаст клиенту настоящую решительность и восстановление регулярных физических актов. Собственно данным витаминами применяются средство Biomanix, применяемые огромным количеством клиентов также урологами, какие именно по период лечения средства умотрели позитивные перевород: быстрое активизация, произведение гормоны, отзывчивость, стойкость в половой связе, продуктивность близкого акта в два р, удаление раннего эякуляции также достаточно различного подобного, то что отмечает результат сразу же первые часы действия. Выбрать средство Biomanix на полезных веществах можно содейственно наш онлайн-страницы <a href=http://biomanix.me/>официальный сайт биоманикса</a>, лишь в демократичные оплатой также описаниями.
      Ответить
      • Форшу мем бойсовый питух
        https://ok.ru/group/51823935029317
        Ответить
        • Ну ты вообще бек кадиров.
          Ответить
          • Узбекистон бойсовый питух
            Ответить
            • Купил бойсового питуха в Фергане, проверь.
              Ответить
              • Здравствуйте, я предлагаю Вам обмен САО суку на 10 курочек обычной породы, либо на 1 бойцового петушка с
                Ответить
    • > GC придумали совсем не из-за того, что освобождать память руками - это слишком сложно.
      > Проблема в том, что такая работа с памятью в контексте современных процессоров с многоуровневым кэшем и SMP нифига не оптимальна

      Лолшто? Океания всегда воевала с остазией? Гц же был, когда о кэшах еще никто и не думал.
      Ответить
    • > Я пишу на C++ на работе и мне за это платят деньги.
      Так он не джавист, он просто говнокодер. Больно мне за профессию.
      Ответить

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