Codegröße steigt bei Verlagerung in eine andere Datei

OP #585633
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
OP #585699
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:
1
 0x000017e8                ConsoleWindow::ConsoleWindow(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
2
...
3
0x0000189c                ConsoleWindow::ConsoleWindow(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
4

5
weiter unten:
6

7
ConsoleWindow::ConsoleWindow(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char) LCD.o
8
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
Gast #585704
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

OP #585715
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

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.