Hallo zusammen, Ich habe für den STM32 eine Kommunikationsbibliothek in C geschrieben. Da ich nun mehrere Kommunikationskanäle gleichzeitig öffnen will und es zu aufwändig wäre, für jeden Kanal alle Statusnachrichten separat zu speichern, habe ich das Projekt kurzerhand in C++ umgeschrieben. Nun kann ich für jeden Kanal eine Klasse instanziieren. Das Problem bei der Sache ist, dass das Programm nun mehr als 4x so groß ist: Vorher: section size addr .text 18436 134217728 .rodata 1980 134236164 .data 504 536870912 .bss 1056 536871416 ._usrstack 4096 536872472 .comment 1302 0 .debug_aranges 4688 0 .debug_pubnames 12424 0 .debug_info 75879 0 .debug_abbrev 14589 0 .debug_line 26631 0 .debug_frame 15092 0 .debug_str 24652 0 .debug_loc 41977 0 .debug_ranges 4992 0 .ARM.attributes 49 0 Total 248347 Nachher: section size addr .text 67816 134217728 .ARM.exidx 744 134285544 .rodata 6768 134286288 .data 1800 536870912 .bss 2688 536872712 ._usrstack 4096 536875400 .comment 1302 0 .debug_aranges 4768 0 .debug_pubnames 12303 0 .debug_info 87708 0 .debug_abbrev 15274 0 .debug_line 27153 0 .debug_frame 24400 0 .debug_str 27519 0 .debug_loc 44303 0 .debug_ranges 4960 0 .ARM.attributes 49 0 Total 333651 Ich weiß, ohne Quellcode wird das sehr theoretisch. Aber gibt es grundlegende Fehler, die ich gemacht haben könnte? Was sollte man bei C++ beachten, um das Programm schlank zu halten? Ich hoffe, ihr könnt mir helfen :)
Florian Micro schrieb: > Vorher: > Total 248347 > Nachher: > Total 333651 Als 4x so groß würde ich das aber nicht bezeichnen. Objektorientierte Programmierung erzeugt nun mal etwas mehr Overhead. 85kb halten sich da noch im Rahmen.
@Peter Guckst Du nicht richtig! .text ist der Code !!! der Rest nur Debugger-Kram. 18K zu 67K etwa 4x
C++ hat wegen Exceptions und RTTI einen großen Overhead. Such mal nach der PDF Datei "Building Bare-Metal ARM Systems with GNU", darin gibt es ein Kapitel "Reducing the Overhead of C++", evtl. hilft dir das.
- keine Templates verwenden - RTTI (RunTime Type Information) abschalten - Exception-Handling abschalten (die ersten C++ Compiler kannten auch gar keine Exceptions) - möglichst wenig virtuelle Methoden - Aufpassen bei Copy-Konstruktoren - Aufpassen, welche Libraries man sich reinholt fchk
@frank Warum keine Templates? Wenn ich das Template in einem Programm nur für einen Datentyp verwende, sollte eigentlich nicht mehr Code entstehen als wenn ich ohne Template arbeite. Es entsteht nur mehr Code, wenn ich das Template für unterschiedliche Datentypen verwende.
Gerd E. schrieb: > @frank > > Warum keine Templates? > > Wenn ich das Template in einem Programm nur für einen Datentyp verwende, ok, dann nicht, aber dann brauchst Du eigentlich auch keine Templates. Ausnahmen bestätigen die Regel. fchk
Frank K. schrieb: >> Wenn ich das Template in einem Programm nur für einen Datentyp verwende, > > ok, dann nicht, aber dann brauchst Du eigentlich auch keine Templates. Wenn ich Templates selbst mache, dann handelt es sich meistens um Libs. Da macht das oft Sinn.
@Achim: Volltreffer! RTTI und Exception-Handling waren schon aus. Aber nicht ganz. Nach Einbinden der mini_cpp.cpp kommt Folgendes raus: section size addr .text 17036 134217728 .eh_frame 4 134234764 .rodata 2856 134234768 .data 24 536870912 .bss 584 536870936 ._usrstack 4096 536871520 .comment 1344 0 .debug_aranges 4832 0 .debug_pubnames 12373 0 .debug_info 88621 0 .debug_abbrev 15590 0 .debug_line 27560 0 .debug_frame 15612 0 .debug_str 27596 0 .debug_loc 44842 0 .debug_ranges 5192 0 .ARM.attributes 37 0 Total 268199 :D:D:D:D Jetzt macht C++ richtig Spaß :) Ok, das Ding säbelt noch ab mit den Vektoren im Ram, aber dazu mach ich nen neuen Thread, falls ich es nicht gelöst kriege. Vielen Dank für eure Hilfe!!
Kurze Memberfunktionen (typisch: Setter und Getter) gehören in die Header Files um dem Compiler Gelegenheit zum inlinen zu geben. const korrekt arbeiten! Nicht unterschätzen sollte man auch, was ein C++ Compiler bei Optimierungen noch rausholen kann. Die komplette I/O Stream Bibliothek, vieles in <algorithm>, die halbe STL, ... beruht darauf, dass der Compiler wie wild Zwischenergebnisse und Temporaries wegoptimieren darf. Zum Thema virtuelle Funktionen. Da würde ich mir nicht allzuviele Gedanken machen. Der Knackpunkt ist die Erste. Hast du erst mal eine virtuelle Funktion in einer Klasse, sind weitere nicht besonders teuer. In der Verwendung sind sie meistens ohnehin sparsamer als die Alternativen. D.h. der indirekte Call kostet zwar etwas aber die Alternative "switch-case-Leiste über eine Typkennung" gibts auch nicht gratis.
Markus Müller schrieb: > Guckst Du nicht richtig! Nö. Maßgeblich ist, was unten bei "Total" steht. Doku nicht gelesen?
Eben nicht. Mein Programm hat unter Total auch 300-400K stehen, in das Flash lädt er dennoch alle .debug nicht rein. Von mir aus kann der auch 100MB als .debug generieren, das Programm passt dennoch in 128KB Flash. Hast wohl noch nie mit GCC und STM32 gearbeitet?
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.