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


von Mark .. (mork)


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

von Florian (Gast)


Lesenswert?

Erzeugst Du Debug-Symbole?

von Andreas K. (a-k)


Lesenswert?

Map-File erzeugen und dort nachsehen warum.

von Mark .. (mork)


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

von Andreas K. (a-k)


Lesenswert?

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


von Peter (Gast)


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


von Andreas K. (a-k)


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.

von Mark .. (mork)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.