Code-Größe bei globaler/localer Erzeugung von Variablen

Gast #3598889
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.
#3598913
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.
Gast #3598943
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.