Кресты / Говнокод #18748 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 CHayT, (Updated )

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

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

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

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

                Я тоже так могу: в С++ удаление и выделение тоже бесплатные, время требуется только для упорядочивания аллокатора.
                Ответить
                    • кучу фрагментирует не аллокатор, а программист
                      а аллокатор стоит рядом и улыбается как идиот:
                      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, получим кукиш
                      а компактизирующий гц пошуршит, но выделит
                      Ответить
                      • Всё это сферическая хрень в вакууме, годная лишь чтобы впаривать детям на презентациях. Если я в сишке буду 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
    ну и вообще говоря, односвязные списки я в плюсах в последний раз использовал примерно никогда.
    Ответить
  • ну таки еще один умный новичек появился

    остается только добавить что-нить по теме:
    есть знакомый упоротый чувак и он тащит хаскилизмы в кресты:
    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
    Ответить
  • Веб-страница вполне новых также долгожданных кинолент также мутисериалов 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>, лишь в демократичные оплатой также описаниями.
    Ответить
  • > GC придумали совсем не из-за того, что освобождать память руками - это слишком сложно.
    > Проблема в том, что такая работа с памятью в контексте современных процессоров с многоуровневым кэшем и SMP нифига не оптимальна

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

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8