Wie groß ist der stack-Speicher für ein bestimmtes Programm, und gibt es irgendwelche compiler-flags, die es einrichten können?

Als der Titel besagt: gibt es eine Allgemeine "Faustregel" über die Größe der Stapel. Ich vermute, dass die Größe variieren je nach dem Betriebssystem, die Architektur, die Größe des cache(s), wie viel RAM verfügbar ist etc.

Kann jedoch nichts gesagt werden, im Allgemeinen, oder gibt es eine Möglichkeit, um herauszufinden, wie viel der stack diese Programm nutzen darf?. Als bonus-Frage gibt es eine Möglichkeit (mit compiler-flags usw. (denken meist C/C++ hier, aber auch allgemein)), dass die Größe des Stapels kann eingestellt werden, um eine Feste Größe, die durch den Benutzer?

Btw, ich Frage streng aus Neugier, ich bin nicht mit einem stack-überlauf. 🙂

  • Die Höhe der Stapel ein bestimmtes Programm zu verwenden ist, im Allgemeinen, unentscheidbaren (es ist äquivalent zu Halteproblem). Sind Sie Fragen, wie können Sie explizit erzwingen, eine begrenzte stack-Größe?
  • Diese Frage kann für Sie von Interesse sein stackoverflow.com/questions/156510/...
  • Erstmal danke! Aber warum ist diese unentscheidbaren und entspricht dem Halteproblem?
  • Die stack-Größe zur Verfügung, um Ihr Programm ist sehr gut definiert. Die Höhe der Stapel ein beliebiges Programm erfordert für die korrekte Funktion ist ähnlich wie das Halteproblem für diese Programme (und nur unentscheidbaren im Allgemeinen-die meisten spezifischen Programmen ermöglicht, eine Analyse).
  • Denn um zu bestimmen, die maximale stack-Auslastung, die Sie im Grunde brauchen, um zu analysieren, alle möglichen code-Pfade (die ich bin sicher, dass Sie sehen können ist sehr ähnlich zu dem problem, die durch das Halteproblem). In einigen (vielleicht auch vielen) Fällen, obwohl, dies kann ermittelt werden, über die statische Analyse. Aber Rekursion oder Funktion Zeiger machen dies schwierig.
  • "ist nur die unentscheidbaren im Allgemeinen-die meisten spezifischen Programmen ermöglicht, eine Analyse" -- korrekt. Ich habe gerade gehört Vint Cerf machen diese häufigen Fehler, zu fordern, ein Programm kann nicht herausfinden, was ein anderes Programm hat wegen der HP. Aber die HP sagt nur, dass es kein Programm, das feststellen kann, ob etwaige Programm wird angehalten. Diese hat so gut wie keine praktischen Konsequenzen, da, zum Beispiel, ist es möglich zu bestimmen, ob jedes Programm, das mit einer begrenzten Menge an Speicher halte. "Aber Rekursion oder Funktion Zeiger machen dies schwierig." -- Irrelevant; HP über formale Unmöglichkeit, nicht zu Schwierigkeit.
  • "Werden Sie Fragen, wie können Sie explizit erzwingen, eine begrenzte stack-Größe?" - Das ist, was er explizit danach gefragt. Offensichtlich, compiler-flags irrelevant sind, wie viel stack-Algorithmus erfordert.
  • Ich war mit denen als Beispiele dafür, Wann ein codebase kann der übergang von "offensichtlich statisch analysierbaren" "oh, ja, das wäre schwierig zu analysieren" (wie ein hand-waving Vorläufer von "unmöglich").
  • Er fragte auch "wie groß ist der stack-Speicher für eine bestimmte Anwendung". Aber ich bin einverstanden, auf einem zweiten Lesen, ist es offensichtlich, was war hier gefragt!
  • Allerdings ist das definitiv nicht mein Gebiet, also, wenn Sie sagen, dass es möglich ist, zu bestimmen, ob ein bounded-storage-Programm halte, werde ich wählen, zu glauben, Sie 😉
  • Begrenzt Speicher impliziert eine begrenzt Anzahl von Staaten. Für ein bestimmtes Programm, jedes dieser Staaten zugeordnet werden können und die nächsten aufeinanderfolgenden Zustand. Dann, für einen beliebigen Startpunkt Staat, Sie (ist, eine Turing-Maschine, die ist nicht begrenzt durch die Lebensdauer oder auch die Dauer des Universums) bestimmen kann, ob es erreicht einen halt-Zustand oder es ist Teil einer Schleife.
  • Ich sehe, danke. Also die Methode ist im wesentlichen simulieren Sie das Programm, bis entweder Sie schlagen eine Globale Zustand ist, den Sie bereits aufgetreten sind, oder Sie schlagen einen halt-Zustand, sowohl von der auftreten würde, in endlicher Zeit. In diesem Licht, die HP ist in der Tat völlig irrelevant hier!
  • Recht. Die HP ist oft falsch angewandt zu unpraktisch Analyse, wenn es sich eigentlich nur bezieht sich auf eine Generalisierung über alle Programme für die es eine formale mathematische Beweis der Unmöglichkeit, per reductio ad absurdum, mit selbst-Referenz a la Gödel-theorem (das kann in der Tat nachgewiesen werden, über die HP-Nachweis).
  • Unrelated: in der edit-queue, stieß ich auf eine Frage, Sie stimmten in triage. Sie, die falsche Wahl gemacht es. Bitte: studieren Sie die Hilfe für die triage, sehr vorsichtig und vermeiden Sie die Platzierung von Elementen in der edit-queue, die dort nicht hingehört. Bitte haben Sie Verständnis, dass Ihre Stimmen haben Konsequenzen! Ich bin speziell reden über stackoverflow.com/review/triage/20908430. Das sollte haben gewesen geschlossen als MCVE (keine Fehlermeldungen gegeben) oder "unklar"! Fühlen Sie sich frei zu fallen mir eine Bemerkung in den Fall Sie haben weitere Fragen oder feedback für mich.

InformationsquelleAutor Andersnk | 2013-03-11
Schreibe einen Kommentar