здравствуйте, можно так сделать - создать список на стеке? это чтобы не выделять память из кучи malloc-ом.
я себе это так представляю - типа, ветвимся, вложенные вызовы, то, се... вот, а конец, извиняюсь, держим в руке)) чтобы не потерять.
каждый элемент списка - в локальных переменных данного экземпляра функции, т.е. на стеке. а работаем с ним в контексте данного вызова (потому что если выйти, оно ж все теряется).
и если да, нужны ли для этого континюэйшены в языке? вернее, в конечном счете (если на Си писать, в котором их нет) все равно получатся континюэйшены, да?
список на стеке
Модератор: Модераторы разделов
-
- Сообщения: 1913
- Статус: zzz..z
-
- Сообщения: 482
Re: список на стеке
// можно так сделать - создать список на стеке?
Конечно. Там, например, уже ведётся "список" локольных переменных.
А Вам какой-то другой нужен ещё ?
// это чтобы не выделять память из кучи malloc-ом.
Это так важно сказать или сделать ?
Из буфера байтов, не лезущего за границу стэка - тоже список можно сделать.
Как если б это был не "стэк", а простая линейная память...
Вам 4К хватит ? За границы стэка такой длиной не залезете, ни на каком этапе ?
Если хватит:
void test()
{
unsigned char yours[1024 * 4] = {0}; // и попёр на нём списки строить
//..
}
Если не хватит (плоско ли рекурсивно) - просто вспомните про кучу
Конечно. Там, например, уже ведётся "список" локольных переменных.
А Вам какой-то другой нужен ещё ?
// это чтобы не выделять память из кучи malloc-ом.
Это так важно сказать или сделать ?
Из буфера байтов, не лезущего за границу стэка - тоже список можно сделать.
Как если б это был не "стэк", а простая линейная память...
Вам 4К хватит ? За границы стэка такой длиной не залезете, ни на каком этапе ?
Если хватит:
void test()
{
unsigned char yours[1024 * 4] = {0}; // и попёр на нём списки строить
//..
}
Если не хватит (плоско ли рекурсивно) - просто вспомните про кучу
Пойдём на рыбалку !
-
- Сообщения: 41
Re: список на стеке
Женя Подсыпальников писал(а): ↑29.03.2013 12:01Вам 4К хватит ? За границы стэка такой длиной не залезете, ни на каком этапе ?
сорри, а где сказано про 4K? C89? я токо про 32K для malloc знаю... в люниксе стек не резиновый?
-
- Сообщения: 482
Re: список на стеке
Это лишь спрошено в моём вопросе
Про абсолютную границу пишится здесь .
Просто число вызовов списковедущих функций в одну стопку
не ограничивается компилятором и линкером прямо.
Однако, имея оба значения, можно посчитать,
а какое же число вызовов списковедущих функций в одну стопку - прервёт исполнение программы
Про абсолютную границу пишится здесь .
Просто число вызовов списковедущих функций в одну стопку
не ограничивается компилятором и линкером прямо.
Однако, имея оба значения, можно посчитать,
а какое же число вызовов списковедущих функций в одну стопку - прервёт исполнение программы
Пойдём на рыбалку !
-
- Сообщения: 41
Re: список на стеке
здравствуйте еще раз, я вот такое имел ввиду:
т.е. список на стеке, взаимная рекурсия, почти без глобальных переменных и все само освобождается.
можно ли это достаточно обобщить для того, чтобы можно было юзать из библиотеки (add, delete, insert, search etc)?
можно ли таким макаром хранить деревья, ведь в них больше одного пути? (интуитивно кажется что да, ведь дерево можно себе представить как список списков)
Код: Выделить всё
type
pnode = ^node;
ppnode = ^pnode;
node = record
key : integer;
next : pnode;
end;
callback=procedure (head :pnode );
procedure reader (head :pnode) ;forward;
const root:pnode=nil;
procedure traverse(head :pnode) ;
(* тут итеративно, не столь важно*)
var p : pnode;
begin
p:=head;
while p<> nil do begin
write(p^.key,' ');
p:=p^.next;
end;
end;
procedure addlist(ch : integer; head:ppnode;cb:callback);
var n : node;
begin
n.key:=ch;
n.next:=head^;
head^:=@n;
cb(@n);
end;
procedure reader (head :pnode);
var ch: integer;
begin
if not eof then begin (* eof - CTRL-D в терминале *)
read(ch);
if eoln then readln; (*глюкавая система I/O паскакаля...*)
addlist(ch,@head,@reader);
end else begin
traverse(head);
end;
end;
begin
reader(nil);
writeln;
end.
т.е. список на стеке, взаимная рекурсия, почти без глобальных переменных и все само освобождается.
можно ли это достаточно обобщить для того, чтобы можно было юзать из библиотеки (add, delete, insert, search etc)?
можно ли таким макаром хранить деревья, ведь в них больше одного пути? (интуитивно кажется что да, ведь дерево можно себе представить как список списков)
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: список на стеке
можно не заниматься ерундой, и переписать на C++, а память выделять ::new.
И не надо пожалуйста ничего выделять на машинном стеке, но не для этого придуман.
деревья можно хранить как угодно, хоть в статическом массиве.
И да, если вы используете стек как хранилище коллекции, вы НЕ можете использовать функции/методы. Потому-что для запоминания адреса возврата используется стек. А если у вас дерево, а не список, то стек используется ещё и для запоминания пути в дереве.
-
- Сообщения: 41
Re: список на стеке
это неспортивно а почему new, а не malloc()? или в плюсах появился сборщик мусора?
я только локальные переменные и параметры и храню. стек для этого и предназначен
adav84 писал(а): ↑02.12.2013 08:26можно ли таким макаром хранить деревья, ведь в них больше одного пути? (интуитивно кажется что да, ведь дерево можно себе представить как список списков)
деревья можно хранить как угодно, хоть в статическом массиве.
И да, если вы используете стек как хранилище коллекции, вы НЕ можете использовать функции/методы. Потому-что для запоминания адреса возврата используется стек. А если у вас дерево, а не список, то стек используется ещё и для запоминания пути в дереве.
это только значит, что "клиентские" ф-ии должны быть повторно входимыми, как reader сверху. т.е. не иметь состояния (при каждом входе делать одно и то-же) или хранить его где-то в куче. так?
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: список на стеке
в вашем C++ не появился и не появится. Используйте PHP.
при чём тут "список"? Наверное первфй пост писал ваш друг, с вашего аккаунта? Спросите у него.
не только и не столько. Это вообще здесь не причём. В одну реку нельзя войти дважды, а именно это вы и пожелали сделать.
-
- Сообщения: 41
Re: список на стеке
ути-пути.
сорри, но это неадекват. удачи.
кто заинтересован в конструктивном общении - велкам.