Forum: Mikrocontroller und Digitale Elektronik STM32 C auf C++ -> Programm 4x so groß


von Florian M. (micro-flo)


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 :)

von Peter (Gast)


Lesenswert?

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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

@Peter

Guckst Du nicht richtig!

.text ist der Code !!!
der Rest nur Debugger-Kram.

18K zu 67K etwa 4x

von Achim (Gast)


Lesenswert?

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.

von Frank K. (fchk)


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

von Gerd E. (robberknight)


Lesenswert?

@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.

von Frank K. (fchk)


Lesenswert?

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

von Gerd E. (robberknight)


Lesenswert?

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.

von Florian M. (micro-flo)


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!!

von Karl H. (kbuchegg)


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.

von Peter (Gast)


Lesenswert?

Markus Müller schrieb:
> Guckst Du nicht richtig!

Nö. Maßgeblich ist, was unten bei "Total" steht. Doku nicht gelesen?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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
Noch kein Account? Hier anmelden.