Forum: Mikrocontroller und Digitale Elektronik Code-Größe bei globaler/localer Erzeugung von Variablen


von dumfbacke (Gast)


Lesenswert?

Hallo,

wenn ich beispielsweise ein Array "uint32_t test[1000]" global erzeuge 
erhalte ich beispielsweise diese Code-Größe:
 text     data      bss      dec      hex  filename
78394     1608    63928   143930    2323a  test.elf



Definiere ich dieses Array jedoch lokal innerhalb der Funktion, erhalte 
ich dieses Code-Größe:
 text     data      bss      dec      hex  filename
78406     1608    63928   143942    23246  test.elf

Wie kommt es, dass das lokale Array plötzlich nicht mehr in der 
Code-Größe auftaucht? Es muss doch trotzdem im Speicher angelegt werden.

von lalala (Gast)


Lesenswert?

dumfbacke schrieb:
> Wie kommt es, dass das lokale Array plötzlich nicht mehr in der
> Code-Größe auftaucht?

Auf welche Zahl genau beziehst Du Dich?

von Karl H. (kbuchegg)


Lesenswert?

dumfbacke schrieb:

> Wie kommt es, dass das lokale Array plötzlich nicht mehr in der
> Code-Größe auftaucht? Es muss doch trotzdem im Speicher angelegt werden.

Ja. Aber erst zur Laufzeit. Und ohne aufwändige Analyse kann kein Tool 
dieser Welt beispielsweise herausfinden, ob die Funktion im Programmlauf 
überhaupt je aufgerufen wird. Zumal das ja des öfteren auch von diversen 
Input-Werten abhängt.

: Bearbeitet durch User
von Jojo S. (Gast)


Lesenswert?

Das Array wird nicht im Code angelegt, nur die Initialisierungswerte. 
Wenn das Array als statische Variable erzeugt wird liegt sie im data 
Segment, innerhalb einer Funktion ist es eine 'automatische' Variable 
die auf dem Stack (bss) landet. Der bss Wert ändert sich trotzdem nicht, 
in deinem Fall ist einfach der Rest 64k - data size. Der Compiler weiss 
nicht wie tief verschachtelt deine Funktion aufgerufen wird, bei 
rekursivem Aufruf werden ja jedesmal sizeof(variable) gebraucht.
In deinem Beispiel ändert sich die data Grösse nicht, das passt also 
nicht. Wenn du das Array nur zum Testen angelegt hast und es nicht 
benutzt wird dann hat der Compiler das evtl. wegoptimiert. Also probiere 
das nochmal (als statische Variable) anzulegen und im Code auch darein 
zu Schreiben, dann muss sich data um 4000 vergrössern.

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.