STM32 C auf C++ -> Programm 4x so groß

OP #1929677
Lesenswert?
• ▲
▼
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 :)
#1929698
Lesenswert?
• ▲
▼
- 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
OP #1929715
Lesenswert?
• ▲
▼
@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!!
#1929717
Lesenswert?
• ▲
▼
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.

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.