Forum: Mikrocontroller und Digitale Elektronik C: Großes Array lokal oder global?


von DirkF (Gast)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Sebastian V. (sebi_s)


Lesenswert?

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.

von asdfasd (Gast)


Lesenswert?

"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.

von Markus (Gast)


Lesenswert?

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

von Moesl0r (Gast)


Lesenswert?

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

von DirkF (Gast)


Lesenswert?

Danke an alle für die zahlreichen guten Antworten!

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
Noch kein Account? Hier anmelden.