performance von C und gegenüber C++
-
Ein wichtiger Grund ist auch, dass C++-Compiler um Größenordnungen schwerer zu entwickeln sind als C-Compiler, und zwar zwar hauptsächlich wegen der komplizierteren Semantik. Kleine Klitschen, die C-Compiler für embedded-Systeme bauen, kümmern sich lieber um Code-Optimierung als um Name-Lookup oder Überladungsauflösung.
-
Bashar schrieb:
[..] Kleine Klitschen, die C-Compiler für embedded-Systeme bauen, kümmern sich lieber um Code-Optimierung als um Name-Lookup oder Überladungsauflösung.
Jetzt hätt ich einmal auch nen gutes Argument gehabt um mitzureden und dann im
letzten Posting ist mir einer zuvorgekommen
-
@Shade
das Argument mit den Templates verstehe ich nicht#include <cstdio> template<class T> T foo(int c) { return c/static_cast<T>(2); }; int main() { std::printf("%f\n",foo<float>(5)); std::printf("%d\n",foo<int>(5)); }
#include <stdio.h> int foo_int(int c) { return c/2; } float foo_float(int c) { return c/(float)2; } int main() { printf("%f\n",foo_float(5)); printf("%d\n",foo_int(5)); return 0; }
sollte ja die gleiche Code größe ergeben. Dachte Templates sind nützlich, weil man Code spart und nicht für jeden Fall alles neu implementieren muss (und noch ein paar andere Tricks). Aber ich denke nicht, dass die Binarys deswegen kleiner werden.
zB dass C++ langsamer sei
Ich denke eher, dass die Leute in dem Fall mehr an die Binary größe denken, aber die ist ja bei C++ gleich (wenn man die C++ Standard-Library nicht linkt, die auf Embedded Systemen ja eh nicht vorhanden ist)
-
kingruedi schrieb:
@Shade
das Argument mit den Templates verstehe ich nichtweil dus falsch verstanden hast
Ich meine nur bei Member Funktionen (habe ich nicht explizit geschrieben, weil ich dachte dass es klar ist - aber jetzt wo ichs nochmal gelesen habe -> du hast recht, ist nicht klar ersichtlich).
Denn es werden nur die Member Funktionen von Template Klassen instanziiert, die auch gebraucht werden, die anderen nicht. Bei 'normalen' non-Template Klassen werden alle Member Funktionen instanziiert.
Dies ist natürlich normalerweise ziemlich egal - aber gerade auf Embedded Systemen kann es Vorteile bringen.
-
Wer sagt denn, dass alle Memberfunktionen von nicht-Template-Klassen "instanziiert" werden müssen? Es gibt kein konformes Programm, dass feststellen kann, dass eine Memberfunktion nicht instanziiert wurde, also steht es dem Übersetzer frei, die Definition im Executable nicht einzubinden, wenn sie nicht angesprochen wird.
-
@Bashar: siehe comp.lang.c++.moderated
-
Das mag bei dem einen Compiler so sein. Generell sagen kann man das mit Sicherheit nicht. Die Frage ist nur, ob der Compiler (bei Templates) oder der Linker (bei nicht-Templates) schlau sein muss.
Dass Memberfunktionen von Templates nicht instanziiert werden, hat eigentlich nur den Effekt, dass in diesen Funktionen nicht nach Fehlern gesucht wird. Beispiel vector<T>::resize für ein T ohne Standardkonstruktor -- macht nichts, solange resize nicht aufgerufen und damit instanziiert wird.
-
mathik schrieb:
im internet finde ich zu dem thema leider auch nichts. vielleicht kannst du mir ja einen link posten, wenn du eins hast
HumeSikkins schrieb:
Nachher vielleicht. Jetzt muss ich los.
So, jetzt bin ich wieder da.
Teste mal std::sort gegen qsort()
OOP erzeugt nicht zwangsläufig Overhead - gute compiler optimieren da 'wie sau'
Stichwort: Abstraction Penalty
Geschwindigkeit dank Templates:
Bitte schön
Bitte schönEin paar simple Vergleiche:
Comparing C++ and C Performance I
-
Agilent verwendet meines Wissens im Embedded-Bereich fast ausschließlich C++.
Okay, was ich bis jetzt gesehen habe sieht eher nach C+ aus, aber egal.
Und die scheinen recht glücklich mit ihrer Wahl zu sein.MFG Jester
-
(denke ich werd den Thread später in die FAQ packen, vorallem die Links von Hume sehen sehr gut aus)