Vorteile durch C11?
-
Guten Morgen,
bis jetzt habe ich immer ausschließlich nach dem C89 Standard programmiert, damit meine Sachen auch im Notfall auf Mikrocontroller funktionieren. Jetzt habe ich aber irgendwo gehört, dass man eigentlich bei den aktuellen Mikrocontroller wie von AVR auch ruhig schon C11 nutzen kann, da man meist die GNU-GCC-Schiene zum Kompilieren nutzt.
Meine Fragen sind nun. Ist es richtig, dass C11 auch auf aktuellen Mikrocontrollern läuft? Ich meine, es ist ja dann eh ein Binary und dem Controller ist es ja egal wie diese erstellt wurde.
Zweitens, wenn ich nach C11 programmiere, also sinf anstelle wie sin nutze, oder Variabeln da deklariere wo sie gebraucht werden etc., habe ich dann auch Geschwindigkeitsvorteile, weil der Compiler dann besser optimieren kann?
-
Disclaimer: Ich programmiere keine Microcontroller.
VitC schrieb:
Ich meine, es ist ja dann eh ein Binary und dem Controller ist es ja egal wie diese erstellt wurde.
So lange du nur die neuen Sprachfeatures nutzt, stimmt das. Wenn du natürlich Funktionen aus der neuen Standardbibliothek aufrufst, dann müssen diese natürlich irgendwie auf dem Controller zur Verfügung gestellt werden.
Zweitens, wenn ich nach C11 programmiere, also sinf anstelle wie sin nutze, oder Variabeln da deklariere wo sie gebraucht werden etc., habe ich dann auch Geschwindigkeitsvorteile, weil der Compiler dann besser optimieren kann?
Jain. sin und sinf sind ja ohnehin erst einmal Funktionsaufrufe. Kann gut sein, dass die Implementierung von sinf für floats schneller ist als sin. Das ist aber genau das Beispiel mit dem Vorhandensein der Standardbibliothek. Ich bin gerade etwas über dieses Beispiel überrascht, ich hatte gedacht, dass die meisten Mikrocontroller freestanding environments, also ohne Standardbibliothek sind.
Lokalität der Variablen sollte bei einem guten Compiler nichts ausmachen, da der ohnehin seine eigene Analyse macht, welche Variablen wo gebraucht werden. Das ist - wie die meisten anderen Sprachmittel auch - eher für dich als Programmierer gedacht. Insgesamt fällt mir sehr wenig ein, was C11 gegenüber C89 als reine Performancefeatures hat. restrict. Vielleicht noch inline. Mit viel Phantasie auch VLAs. Aber das allermeiste ist eher dazu da, den Programmierkomfort zu steigern oder Dinge zu standardisieren (die dann auch performancerelevant sein können), bei denen vorher jeder Compiler seine eigene Erweiterung hatte (eben beispielsweise restrict). Eine Ausnahme ist natürlich die Standardbibliothek, da gibt es vieles, was auf Performance ausgelegt ist, Threads beispielsweise. Aber wie schon gesagt bin ich eher überrascht, dass du überhaupt von einer Standardbibliothek auf Mikrokontrollern sprichst, als wäre das selbstverständlich. Eine volle Implementierung der C11-Standardbibliothek wäre noch viel überraschender.
-
Ich habe bis jetzt wenig mit C auf Mikrocontroller gemacht, das war daher eher eine vorausschauende Frage. Danke für deine sehr ausführliche Einschätzung.
-
Ab C89 oder C11 ist keine Eigenschaft vom Prozessor sondern vom Compiler.
Wenn der Compiler für deinen Mikrocontroller C11 unterstütz, kannst du es auch benutzen.Wobei Mikrocontroller ein sehr weiter Begriff ist. Die (64- oder 32-Bit) ARM-Prozessoren aus den Smartphones oder Raspberry Pi gehören auch dazu, genauso wie 8-Bit-Prozessoren.
Und es gibt auch eine "Standard"bibliothek für die Compiler.
Wie weit die Implementiert ist, hängt auch von der Hardware ab (was nütztfopen
ohne Massenspeicher)Weil du den AVR-GCC mit
sinf
ansprichst. Der AVR-GCC kennt nurfloat
. Selbst wenn dudouble
schreibst, bekommst du nur einfloat
.stdint.h ist von Vorteil.
Wenn du ein Feature von C11 oder C99 nutzen möchtest, musst du halt vorher nachschauen ob es der Compiler unterstützt.
-
Ok, danke auch dir.