Hallo, wird bei dem XC32 Compiler von Microchip das u.g. lokale statische Array "static int Puffer[MaxNummer][MaxWerte];" bei Prozessorstart automatisch auf 0 initialisiert ?
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
|
Anzeige
|
Werden statische lokale Arrays vom XC32 compiler automatisch beim Programmstart auf 0 initialisiertHallo, wird bei dem XC32 Compiler von Microchip das u.g. lokale statische Array "static int Puffer[MaxNummer][MaxWerte];" bei Prozessorstart automatisch auf 0 initialisiert ?
Normalerweise schon (Liegen im BSS). Aber schreib einfach
Wenn dir die Initialisierung wichtig ist. Wenn der Compiler das eh gemacht hätte, ist das kein zusätzlicher Code, und es dient gleichzeitig als Kommentar. :
Bearbeitet durch User
Wenn er mit dem C-Standard konform ist: ja.
Kann man nicht garantieren. Der GCC hatte dafür vor Jahren explizit zusätzlichen Code produziert. Danke an euch für die Hinweise (und dass ich nicht beschimpft worden bin :-) bei den alten PIC-Compilern (bevor sie non Microchip aufgekauft wurden) musste man den Startup-Code entsprechend ... konfigurieren/anpassen. Oft zählt da halt Zeit/platz Normalerweise trennt ein Compiler zwischen Bereichen, die gelöscht werden und Bereiche, die initialisiert werden. Über den gelöschten Bereich wird einfach jedes Byte mit 0 beschrieben, der initialisierte hat ein pendant im Flash, das drüberkopiert wird. Such mal unter Startup im Handbuch. Alternative (nicht ganz so sicher): Initialisiere mit einem Feld ungleich 0 und schaue, ob der Code (genauer: Der ROM-Bedarf) mehr wird. Im anderen Schritt lasse die Initialisierung ganz weg und schaue im Linker-File, ob es eine andere "section" gibt, in der die Variable jetzt liegt :
Bearbeitet durch User
Hallo, habe es mal getestet.
Wenn ich also das Array mit 0 initialisiere, hat es den gleichen Speicherverbrauch wie ohne Initialisierung. Danke für den Tipp. Was ich nicht verstehe: Warum werden bei Initialisierung mit "11" nur 48 Byte mehr Flash verbraucht, obwohl das Feld ja 100 * 16 * 4 Byte groß ist. :
Bearbeitet durch User
Es gibt memset
Die Frage wäre korrekt: warum werden überhaupt 48 Byte verbraucht? Vermutlich wird in dem Moment der Initialisierungscode erst mit gelinkt – aber das müsstest du an deinem Compilat selbst erkunden. Dass du nur das erste Byte auf 11 initialisierst und den Rest auf 0, wird dir spätestens dabei auch auffallen. ;-)
Vermute es war die einzige initialisierte Variable im Code, und der entsprechende INIT-Code-Block wird sonst garnicht eingebaut? aus der pic32 "crt0.S":
Weil es in beiden Fällen identisch initialisiert wird, wenn das System C-konform aufgesetzt ist.
Es ist durchaus plausibel, dass die Compiler-Hersteller auch diesen Speicherverbrauch optimieren: Während es früher bei den von mir genutzten Compilern schwarz/weiß-Entscheidungen waren (nichts initialisiert vs. mindestens 1 Feld), ist es eine sehr sinnvolle Verbesserung, das Array in die "gelöschte"-Sektion zu packen und danach explizit das eine Feld auf 11 zu setzen.
Ist das wirklich so ? Das würde den zweiten Beitrag von Ernst B. wiedersprechen.
Wenn eine Initialisierungsliste kürzer ist als die Gesamtzahl der Elemente im Array, werden alle nicht explizit erwähnten Elemente standardmäßig mit dem Nullwert des jeweiligen Datentyps (bei int also 0) initialisiert. d.H. ein Element auf 11, der Rest auf 0.
Das trifft übrigens für alle Initialisierungen zu, nicht nur bei statischer Speicherklasse. Also auch wenn obige Variable von der Speicherklasse "auto" wäre, würde sie durch benennen eines einzigen (in diesem Falle auch eines von 0 verschiedenen) Initialwertes im Rest der Variable genullt. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|