mikrocontroller.net

Forum: Compiler & IDEs Codegröße steigt bei Verlagerung in eine andere Datei


Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe gerade meinen Code etwas "aufgeräumt". Ein Teil davon war die 
Verlagerung der Konstruktoren einiger Klassen in eine eigene cpp-Datei, 
denn zuvor waren diese noch im Header mit enthalten. Nach dem 
Compilieren stellte ich fest, dass mein Code aufeinmal 13kb anstatt 10kb 
groß war. Nachdem ich probeweise die Konstuktoren direkt in die Header 
mit den Deklarationen einfügte, war der Code wieder 10kb groß.

Wie kann das sein???

Als Compiler benuze ich den arm-elf-gcc 4.1.1 (WinARM)

MfG Mark

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erzeugst Du Debug-Symbole?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Map-File erzeugen und dort nachsehen warum.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Erzeugst Du Debug-Symbole?
Nicht dass ich wüsste.

>Map-File erzeugen und dort nachsehen warum.
Danke für den Tipp.
Anscheinend kommt der Konstruktor 2x im Code vor, hier ein Auszug aus 
dem Map-File:
 0x000017e8                ConsoleWindow::ConsoleWindow(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
...
0x0000189c                ConsoleWindow::ConsoleWindow(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)

weiter unten:

ConsoleWindow::ConsoleWindow(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char) LCD.o
ConsoleWindow::ConsoleWindow(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char) LCD.o

Ich versteh nciht wieso der Linker da nicht meckert, weil 2x die gleiche 
Funktion vorkommt. Komischerweise ist es nur bei dieser Klasse der Fall.

MfG Mark

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal -ffunction-sections -fdata-sections. Das Linker-Script 
sollte dann allerdings *(.text.*) und *(.data.*) enthalten.


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht liegt es an totem Code (=Code bzw. Funktionen, die im 
Programm nie aufgerufen wird), den  Du in andere Module ausgelagert 
hast?

Solange dieser tote Code nur innerhalb einer Compile-Einheit liegt, 
(C-Datei => obj-Datei), erkennt dies der Optimizer und optimiert diesen 
Code weg.

Wenn der Code aber über verschiedene obj-Files verteilt ist, weiss der 
Compiler ja nicht, dass eine Funktion nie aufgerufen wird, und 
compiliert alles mit. Erst der Linker fügt dann die obj-Dateien 
zusammen, ohne nochmals zu optimieren.

Aber soviel ich weiss bietet der GCC 4.1.1 als neue Option eine Art 
"Global-Optimizer", mit welcher solcher toter Code trotzdem wegoptimiert 
wird. Wo und welche Parameter Du dafür im makefile angeben musst, weiss 
ich aber so auf die schnelle nicht auswendig....


Gruss Peter


Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowas kann sich u.U. vervielfachen, wenn es "inline" ist (explizit, oder 
in der Klasse selbst definiert) und per include in mehreren Files 
vorkommt.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Peter wrote:
>Vielleicht liegt es an totem Code (=Code bzw. Funktionen, die im
>Programm nie aufgerufen wird), den  Du in andere Module ausgelagert
>hast?

Jepp, genau das war es. Ich hab ein Objekt der Klasse ConsoleWindow 
deklariert, und schon war der Code in beiden Fällen genau so groß, 
nämlich die 13kb.

>Aber soviel ich weiss bietet der GCC 4.1.1 als neue Option eine Art
>"Global-Optimizer", mit welcher solcher toter Code trotzdem wegoptimiert
>wird. Wo und welche Parameter Du dafür im makefile angeben musst, weiss
>ich aber so auf die schnelle nicht auswendig....

Sowas hab ich mir schon lange gewünscht, dachte aber nciht, dass es 
schon vorhanden ist. Ich werd mal googlen, vllt find ich ja was dazu.

Vielen Dank für die Hilfe an alle!

MfG Mark

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.