список на стеке

Модератор: Модераторы разделов

adav84
Сообщения: 41

список на стеке

Сообщение adav84 »

здравствуйте, можно так сделать - создать список на стеке? это чтобы не выделять память из кучи malloc-ом.
я себе это так представляю - типа, ветвимся, вложенные вызовы, то, се... вот, а конец, извиняюсь, держим в руке)) чтобы не потерять.
каждый элемент списка - в локальных переменных данного экземпляра функции, т.е. на стеке. а работаем с ним в контексте данного вызова (потому что если выйти, оно ж все теряется).
и если да, нужны ли для этого континюэйшены в языке? вернее, в конечном счете (если на Си писать, в котором их нет) все равно получатся континюэйшены, да?
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: список на стеке

Сообщение deadhead »

man alloca?
[x] close
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: список на стеке

Сообщение Женя Подсыпальников »

// можно так сделать - создать список на стеке?
Конечно. Там, например, уже ведётся "список" локольных переменных.
А Вам какой-то другой нужен ещё ? :)

// это чтобы не выделять память из кучи malloc-ом.
Это так важно сказать или сделать ? :)

Из буфера байтов, не лезущего за границу стэка - тоже список можно сделать.
Как если б это был не "стэк", а простая линейная память... :)

Вам 4К хватит ? За границы стэка такой длиной не залезете, ни на каком этапе ?

Если хватит:
void test()
{
unsigned char yours[1024 * 4] = {0}; // и попёр на нём списки строить
//..
}

Если не хватит (плоско ли рекурсивно) - просто вспомните про кучу :)
Пойдём на рыбалку !
Спасибо сказали:
adav84
Сообщения: 41

Re: список на стеке

Сообщение adav84 »

Женя Подсыпальников писал(а):
29.03.2013 12:01
Вам 4К хватит ? За границы стэка такой длиной не залезете, ни на каком этапе ?


сорри, а где сказано про 4K? C89? я токо про 32K для malloc знаю... в люниксе стек не резиновый?
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: список на стеке

Сообщение Женя Подсыпальников »

Это лишь спрошено в моём вопросе :)

Про абсолютную границу пишится здесь .

Просто число вызовов списковедущих функций в одну стопку
не ограничивается компилятором и линкером прямо.

Однако, имея оба значения, можно посчитать,
а какое же число вызовов списковедущих функций в одну стопку - прервёт исполнение программы :)
Пойдём на рыбалку !
Спасибо сказали:
adav84
Сообщения: 41

Re: список на стеке

Сообщение adav84 »

здравствуйте еще раз, я вот такое имел ввиду:

Код: Выделить всё

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)?
можно ли таким макаром хранить деревья, ведь в них больше одного пути? (интуитивно кажется что да, ведь дерево можно себе представить как список списков)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: список на стеке

Сообщение drBatty »

adav84 писал(а):
02.12.2013 08:26
можно ли это достаточно обобщить для того, чтобы можно было юзать из библиотеки (add, delete, insert, search etc)?

можно не заниматься ерундой, и переписать на C++, а память выделять ::new.

И не надо пожалуйста ничего выделять на машинном стеке, но не для этого придуман.
adav84 писал(а):
02.12.2013 08:26
можно ли таким макаром хранить деревья, ведь в них больше одного пути? (интуитивно кажется что да, ведь дерево можно себе представить как список списков)

деревья можно хранить как угодно, хоть в статическом массиве.

И да, если вы используете стек как хранилище коллекции, вы НЕ можете использовать функции/методы. Потому-что для запоминания адреса возврата используется стек. А если у вас дерево, а не список, то стек используется ещё и для запоминания пути в дереве.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
adav84
Сообщения: 41

Re: список на стеке

Сообщение adav84 »

drBatty писал(а):
02.12.2013 11:29
можно не заниматься ерундой, и переписать на C++, а память выделять ::new.

это неспортивно :) а почему new, а не malloc()? или в плюсах появился сборщик мусора?

drBatty писал(а):
02.12.2013 11:29
И не надо пожалуйста ничего выделять на машинном стеке, но не для этого придуман.


я только локальные переменные и параметры и храню. стек для этого и предназначен

adav84 писал(а):
02.12.2013 08:26
можно ли таким макаром хранить деревья, ведь в них больше одного пути? (интуитивно кажется что да, ведь дерево можно себе представить как список списков)
деревья можно хранить как угодно, хоть в статическом массиве.

И да, если вы используете стек как хранилище коллекции, вы НЕ можете использовать функции/методы. Потому-что для запоминания адреса возврата используется стек. А если у вас дерево, а не список, то стек используется ещё и для запоминания пути в дереве.


это только значит, что "клиентские" ф-ии должны быть повторно входимыми, как reader сверху. т.е. не иметь состояния (при каждом входе делать одно и то-же) или хранить его где-то в куче. так?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: список на стеке

Сообщение drBatty »

adav84 писал(а):
03.12.2013 09:00
а почему new, а не malloc()? или в плюсах появился сборщик мусора?

в вашем C++ не появился и не появится. Используйте PHP.
adav84 писал(а):
03.12.2013 09:00
я только локальные переменные и параметры и храню. стек для этого и предназначен

при чём тут "список"? Наверное первфй пост писал ваш друг, с вашего аккаунта? Спросите у него.
adav84 писал(а):
03.12.2013 09:00
это только значит, что "клиентские" ф-ии должны быть повторно входимыми

не только и не столько. Это вообще здесь не причём. В одну реку нельзя войти дважды, а именно это вы и пожелали сделать.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
adav84
Сообщения: 41

Re: список на стеке

Сообщение adav84 »

drBatty писал(а):
03.12.2013 09:34
в вашем C++ не появился и не появится. Используйте PHP.

ути-пути.

drBatty писал(а):
03.12.2013 09:34
Наверное первфй пост писал ваш друг, с вашего аккаунта?

drBatty писал(а):
03.12.2013 09:34
не только и не столько. Это вообще здесь не причём. В одну реку нельзя войти дважды, а именно это вы и пожелали сделать.


сорри, но это неадекват. удачи.
кто заинтересован в конструктивном общении - велкам.
Спасибо сказали: