AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stack Overflow

Ein Thema von evilhomer · begonnen am 13. Jun 2008 · letzter Beitrag vom 13. Jun 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#11

Re: Stack Overflow

  Alt 13. Jun 2008, 18:30
Hi,

der Stack ist nicht unendlich groß. Normalerweise ist die Obergrenze 64 KiB, kann aber bis auf 16 MiB angehoben werden (Projektoptionen->Linker->Max. Stackgröße->Größe eintragen).

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
evilhomer

Registriert seit: 13. Jun 2008
Ort: Würzburg
6 Beiträge
 
#12

Re: Stack Overflow

  Alt 13. Jun 2008, 19:20
Okay, danke! Nun sind bereits die Zahlen bis 1000 drin, aber so eine richtige Lösung für das Problem fehlt noch immer.
Wenn ich das gleiche auf dem iterativen Weg mit zwei Schleifen rechnen lasse, sind einige 100000 drin ohne dass sich der Stack meldet, d.h. hier kann es doch nicht so Speicher-intensiv sein?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Stack Overflow

  Alt 13. Jun 2008, 19:29
Ja, natürlich. Der große Nachteil von rekursiven Lösungen ist immer der Stack-Verbrauch, der bei iterativen Varianten nicht so horrend ist.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#14

Re: Stack Overflow

  Alt 13. Jun 2008, 19:44
Hi,

ich glaube, du hast noch nicht wirklich verstanden, wie das mit dem Stack abläuft.

Ganz einfaches Beispiel:

Delphi-Quellcode:
procedure foo;
begin
  while ... do
    ...;
end;

procedure bar;
begin
  ...
  if ... then
    bar;
end;
Foo soll hier iterativ arbeiten. Es gibt keine Parameter oder lokale Variablen, also landet nur beim Aufruf die Rücksprungadresse (also da, von wo aufgerufen wurde und nach verlassen weitergearbeitet werden soll), auf dem Stack. Während Foo arbeitet, verändert sich die Größe des Stacks nicht (es sei denn, Foo ruft etwas weiteres auf, bei Rückkehr zu Foo wird wieder die alte Größe erreicht).

Bar hingegen arbeitet rekursiv. Während bar arbeitet, ruft es sich selbst auf - entsprechend oft landet die Speicheradresse auf dem Stack, von der bar sich selbst aufruft. Erst beim Verlassen eines bars wird der Wert wieder entfernt. Wenn Bar fertig ist, werden nach und nach alle bars verlassen, und der Stack wird wieder kleiner. Hier werden maximal Rekursionstiefe mal Rücksprungadressen abgelegt. Der Stack wird also viel mehr beansprucht.

Rekursive Funktionen sind immer Stackintensiver als iterative. Das zeigt sich deutlich an diesem Beispiel:

Delphi-Quellcode:
function fakultaet(Zahl: Cardinal): Double;
begin
  if Zahl <= 1 then
    Result := 1
  else
    Result := Zahl * fakultaet(Zahl-1);
end;

function fakultaet(Zahl: Cardinal): Double;
begin
  Result := 1;
  while Zahl > 1 do
  begin
    Result := Zahl * Result;
    Zahl := Zahl - 1;
  end;
end;
Die iterative Funktion ruft keine weiteren Funktionen auf, die Rekursive Funktion hingegen sich selbst - und das Zahl - 2 mal. Sie belegt (Zahl - 2) * 4 Bytes mehr auf dem Stack - alleine schon für die Rücksprungadressen. Hinzu kommt noch der Parameter - auch, wenn Register die Aufrufkonvention ist, denn dasselbe Register wird für den nächsten Aufruf ja mit einem neuen Wert belegt, der alte wird jedoch noch später für die Multiplikation benötigt.

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz