Hallo zusammen, Habe ja mittlerweile mein TFT Display ans laufen bekommen. Das ganze Handling des Display ist in einer Funktion, die von Main zyklisch aufgerufen wird. Unter anderem möchte ich auf dem Display ein Trend-Chart darstellen, der halt Messwerte über dei Zeit darstellt. Vom Main wird nur der aktuelle Messwert übertragen. In der Funktion vom Display würde ich ein lokales Array " Static int [1000]" anlegen, um die Messwerte zu speichern. Könnten später aber auch noch mehr Werte werden. Ist es so, dass lokale Variablen immer im Stack gespeichert werden ? Besteht die Gefahr eines Stack Overflow ? Wäre es besser, diese große Datenmenge global zu definieren ? Gruß Dirk
DirkF schrieb: > Ist es so, dass lokale Variablen immer im Stack gespeichert werden ? > Besteht die Gefahr eines Stack Overflow ? Nicht wenn du static davorschreibst, wie du es ja getan hast. > Wäre es besser, diese große Datenmenge global zu definieren ? Globale Variablen sollte man nur dann verwenden, wen wirklich mehrere Funktionen darazuf zugreifen können müssen.
DirkF schrieb: > Ist es so, dass lokale Variablen immer im Stack gespeichert werden ? Eigentlich ja, aber static Variablen sind keine gewöhnlichen lokalen Variablen und werden in der BSS Section gespeichert. DirkF schrieb: > Besteht die Gefahr eines Stack Overflow ? Der besteht immer, wenn man im Vergleich zum verfügbaren RAM große Variablen speichern möchte. Ob die Variablen auf dem Stack, der BSS Section oder sonstwo gespeichert werden macht dabei keinen Unterschied. Der Unterschied liegt einzig darin was der Compiler schon zur Compilezeit herausfinden kann. Bei globalen oder static Variablen weiß der Compiler wie viel Speicher diese brauchen und man kann sich nach dem Compilieren die Größe der BSS Section anschauen, um zu sehen wie viel Speicher noch für den Stack übrig ist. Herauszufinden wie viel Stack in allen möglichen Codepfaden des Programms maximal benötigt wird ist dagegen ein nicht triviales Problem. DirkF schrieb: > Wäre es besser, diese große Datenmenge global zu definieren ? Deine Frage bezieht sich ja auf static lokal vs. global. Da beides in der BSS Section landet ist es egal.
"Statics" landen nie auf dem Stack - egal ob global oder lokal. Der benötigte Speicherplatz wird während der Compilierung "statisch" zugewiesen und ist für die gesamte Laufzeit des Programs für genau diese Variable explizit reserviert.
Hi, lokale statische Variablen werden auf dem Heap und nicht auf dem Stack abgelegt. Nicht statische lokale Variablen landen auf dem Stack. Zum Stackoverflow kommt es, wenn die eine Funktion eine andere aufruft, die wieder eine andere usw. und all diese Funktionen in Summe zu viel Stack für ihre lokalen Variablen benötigen. In den Heap verschoben, also static deklariert, würden diese Variablen aber nun am Heap nagen, und andere Funktionen werden dann in den Stackoverflow getrieben: es zählt der Gesamtverbrauch des Speichers, also Heap plus Stack. Sind die Funktionsaufrufe solcher Stack-Verbraucher dagegen nicht verschachtelt, kann jeder mehr Stack verbrauchen. In einem solchen Szenario dann die lokalen Variablen mit der static-Deklaration in den Heap zu verschieben, gleicht dann einem Suizid. Grüße, Markus
Statische Variablen landen definitiv nicht auf dem Heap. Sie landen entweder in der BSS Section (wenn nicht initialisiert) oder in der DATA Section. Wer's genau wissen will: http://www.inf.udec.cl/~leo/teoX.pdf
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.