variable im mapfile

Gast #6560068
Lesenswert?
• ▲
▼
Moin,
irgendwie funktioniert mein Gehirn heute nicht so richtig...:

Im mapfile werden doch zur Compilezeit die bekannten "Objekte" angelegt?
Wenn es also z.B. eine Variable my_var gibt (von mir aus sogar global, 
außerhalb main), wird sie (zumindest im Debug) auch wirklich erzeugt. 
Dann muß doch zur Compilezeit schon RAM dafür zugewiesen werden und 
my_var im mapfile mit Speicheradresse und Speicherverbrauch auftauchen? 
Tut sie aber nicht...
Alle anderen Randbedingungen (arm-none-eabi-c++ usw.) sollten da ja 
wirklich keinen Einfluß bei dieser Grundsatzfrage haben.
#6560075
Lesenswert?
• ▲
▼
Nein.

Wenn die Variable nicht benutzt wird, dann wird der Linker diese nicht 
mit ins elf aufnehmen. Ausnahme: In der gleichen Datei sind noch andere 
statische oder globale Variablen, die im gleichen Segment 
(.bss/.data/.rodata) liegen, welche irgendwo referenziert werden. (Der 
Linker kann keine Sections aus einer Datei zerstückeln)

Wenn die Variable eine statische Konstante ist, dann könnte der Compiler 
diese eventuell schon entsorgen.

Wenn man zusätzlich noch LTO benutzt dann kann es noch anders laufen: 
der Linker könnte die Variable wegoptimieren, obwohl sie referenziert 
wird :-)
Gast #6561009
Lesenswert?
• ▲
▼
Danke, die Argumente kann ich nachvollziehen. Aber konkret hier sollte 
ja nichts davon zutreffen:
1
#include <stdint.h>
2

3
int main (void)
4
   {
5
      uint32_t loc_var1;
6
      uint32_t loc_var2 = 8;
7

8
      loc_var1++;
9
      loc_var2++;
10
      uint32_t addr = reinterpret_cast<uint32_t>(&loc_var1);
11
      addr++;
12
   }

Es gibt eine Warnung, daß loc_var1 uninitialisiert verwendet wird, was 
ja auch gut und richtig ist.

Aber alle 3 Variablen werden aus Sicht des Compilers und Linkers auch 
verwendet (nach meinem Verständnis, und unused_warnings gibt es auch 
nicht). Es ist also klar, daß es diese 3 Variablen im Programm verwendet 
werden und somit garantiert Speicher brauchen. Und daher hätte ich 
erwartet, daß sie im mapfile auftauchen.
Da sie das aber nicht tun, hatte ich bisher wohl eine falsche 
Vorstellung der statischen "Speicherauslastungsberechnung".

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.