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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren