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
Map-File erzeugen und dort nachsehen warum.
>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
Probier mal -ffunction-sections -fdata-sections. Das Linker-Script sollte dann allerdings *(.text.*) und *(.data.*) enthalten.
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
Sowas kann sich u.U. vervielfachen, wenn es "inline" ist (explizit, oder in der Klasse selbst definiert) und per include in mehreren Files vorkommt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.