- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 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);
}
самое забавное, что это поциент высрал после того, как два дня всем доказывал, что у гц огромный оверхед
ну да, в таком мире и правда всё плохо
Это что такое?
Это по русски, пидар, пидар, пидар????
Компактизирующих гц не бывает в фантазии тех, у кого удаление бесплатное.
"Его" говнокод - не его, это он допилил как есть чужой говнокод.
время требуется для сканирования стеков, да на компактизацию достижимых объектов
> "Его" говнокод - не его, это он допилил как есть чужой говнокод.
создание второго списка(!) для удаления первого -- его изобретение
оверхед любого самого задрипанного гц будет по всем параметрам меньше, чем у этого лютого говна
Модно кричать что гц - говно. А писать хороший код - не модно. Что это за хуйня, действительно! Люди вон уже ложку для селфи придумали, а вы - писать хороший код. нонсенс!
И чо, и чо? Он показал, как эту хрень удалить без рекурсии. Решение - влобное, первое попавшееся. И ещё он в курсе про то, что это говно и что в стд существует форвард_лист.
> да, удаление бесплатное, выделение памяти тоже
Я тоже так могу: в С++ удаление и выделение тоже бесплатные, время требуется только для упорядочивания аллокатора.
а аллокатор стоит рядом и улыбается как идиот:
в итоге имеем сто дырок по sizeof(int)*1000 байт
если после этого попытаться выделить памяти на MEM_MAX-sizeof(int)*1000, получим кукиш
а компактизирующий гц пошуршит, но выделит
Если я в жабке буду много раз либо выделять случайное количество памяти, либо ээээ... забывать случайный блок из ранее выделенных, то жор памяти будет расти, пока оператива не закончится, и дырки так и будут зиять, пока гэцэшэчка не соизволит прибраться.
и любое обращение к массивам, выделение/освобождение памяти пусть идет через эту питушню
А потом вот если надо что-то записать/прочитать в такую myshittymalloc-нутую память, надо херачить вот такой сорт говна
и в этом говне читается хрень из fucingpointers[a[1]]. Т.е. сырые указатели на хип живут только в этом fucingpointers говномассиве
Отака хуйня, малята. И теперь если как-нибудь сильно изосрать память, чтобы там были дыры, и выделение памяти от этого обделывается, можно запускать особую хрень, которая уже пробегается по всему этому fucingpointers[dofiga] и переутрамбовывает(дефрагментирует) это все плотным куском, чтоб без дыр, при этом патча все эти адреса из массива fucingpointers.
Ну тогда:
и это ты называешь "без рекурсии"?
Ты до сих пор походу не догоняешь разницу между "код для примера" и "рабочий код".
Хе-хе-хе. Помню даже где-то обсуждали сортировку с O лучше теоретического, сложность уходила именно в алокатор.
bool realloc_inplace (void* ptr)
который можно использовать в контейнерах, угадайте, что он делает.
Да, а стандартный realloc - дерьмо.
И как он дружит с многопоточностью? Хотел зеленым, но не буду.
> Borm And!
borm & 5 часов назад
В юникоде B | m = o
так что
o& 5 часов назад
Кстати, в том же 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).
ну и вообще говоря, односвязные списки я в плюсах в последний раз использовал примерно никогда.
Ну можно ещё разность, но там обход в разные стороны по-разному будет выглядеть. Неудобно.
http://www.youtube.com/watch?v=BL68Sp-4Dqs
https://www.youtube.com/watch?v=koovuH7zX48
p.s. slayer - нормальная группа.
остается только добавить что-нить по теме:
есть знакомый упоротый чувак и он тащит хаскилизмы в кресты:
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
Хава нагила
Хава
https://ok.ru/group/51823935029317
Асуну?
Средний азий рядом
Есть бойсовый питух ?
> Проблема в том, что такая работа с памятью в контексте современных процессоров с многоуровневым кэшем и SMP нифига не оптимальна
Лолшто? Океания всегда воевала с остазией? Гц же был, когда о кэшах еще никто и не думал.
Так он не джавист, он просто говнокодер. Больно мне за профессию.