C++ und C, Unterschied



  • Ich hätte gerne VLAs für Threading mit OpenMP. häufig brauche ich nur ein paar Byte pro Thread und müsste mir, weil die Anzahl der Threads dynamisch ist, teuer speicher vom Heap holen. Für microthreads echt unangenehm. Dann lieber einmal kurz etwas mehr Speicher vom Stack holen.



  • otze schrieb:

    Ich hätte gerne VLAs für Threading mit OpenMP. häufig brauche ich nur ein paar Byte pro Thread und müsste mir, weil die Anzahl der Threads dynamisch ist, teuer speicher vom Heap holen. Für microthreads echt unangenehm. Dann lieber einmal kurz etwas mehr Speicher vom Stack holen.

    Wenn du's wirklich brauchst: Praktisch jeder Compiler unterstützt sowas wie alloca()... 😉



  • Wenn performancemäßig nötig, mache ich dann ein if (i_can_has_vla)/else malloc.

    Und da wird es meines Erachtens wichtig, eine saubere Programm-Struktur zu haben, damit man sich kein Speicherloch einfängt.

    Ich hätte gerne VLAs für Threading mit OpenMP. häufig brauche ich nur ein paar Byte pro Thread und müsste mir, weil die Anzahl der Threads dynamisch ist, teuer speicher vom Heap holen. Für microthreads echt unangenehm. Dann lieber einmal kurz etwas mehr Speicher vom Stack holen.

    Für welche Dinge benötigt man solche Mikro-Optimierungen?

    Ist es da nicht besser an der Komplexitätsklasse rumzuschrauben?


  • Mod

    Bitte ein Bit schrieb:

    Ist es da nicht besser an der Komplexitätsklasse rumzuschrauben?

    Ich lege dir mal alle meine mikrooptimierten Programme vor, du erklärst mir dann, wie ich die Komplexitätsklasse hätte verbessern können?



  • Ich lege dir mal alle meine mikrooptimierten Programme vor, du erklärst mir dann, wie ich die Komplexitätsklasse hätte verbessern können?

    Was soll das? 😡

    Ja gerne. Ich würde mal gerne ein Programm sehen. Was für Programme sind das, für die sich solche Optimierungen lohnen? High-End Simulationen? Interrupt Funktionen?

    Hier wird von OpenMP und Threads gesprochen. Aber gleichzeitig auch von teueren malloc Aufrufen, Microthreads und Cachemisses. Und den Sinn dahinter verstehe ich nicht. Ich verstehe es nicht wie man OpenMP nutzen kann, und dann bei Optimierungsproblemen wie Microthreads und Cachemisses hängen bleibt.

    Annahme: Ich führe eine Berechnung mit N Threads durch. Durch einen Fehler sind N-1 Threads schnell fertig, wodurch aber der letzte Threads umso länger benötigt... Und da der Hauptthread auf das Ende aller Threads wartet, ist kein Zeitgewinn durch die Threads zu erwarten.

    Lohnen sich Microthreads denn überhaupt, da der Kontextwechsel einen nicht unerheblichen Beitrag zur Thread Laufzeit leistet?

    Wenn Cache Misses ein Problem sind, sollte ich mir überlegen einen Non-Paged Memory Pool zu allokieren oder gleich einen entsprechenden Treiber zu schreiben um direkten Zugriff auf die Hardware zu haben und um das Betriebssystem zu umgehen.

    Und was macht der Optimierer überhaupt? Nutzt dieser den kompletten Befehlsatz der CPU? Kämpfen Mikrooptimierungen nicht gegen den Optimierer? Oder sollen Mikrooptimierungen den mangelhaften Optimierer/Compiler ausgleichen?

    Ich habe es schon erlebt dass man effizient programieren wollte, man sich aber viele Nebenbedingungen einhandelte, das Design darunter Not litt und am Ende sogar langsamer war. Und darum bin ich vorsichtig in Sache Mikro-Optimierungen.


  • Mod

    Bitte ein Bit schrieb:

    Ich lege dir mal alle meine mikrooptimierten Programme vor, du erklärst mir dann, wie ich die Komplexitätsklasse hätte verbessern können?

    Was soll das? 😡

    Es soll dich darauf aufmerksam machen, dass die Anmerkung, mal eben so die Komplexitätsklasse zu verbessern, Unsinn ist, wenn es um ein Argument gegen Mikrooptimierung geht.

    Wenn du so weit bist, dass du optimierst, dann liegt die Auswahl des Algorithmus schon lange hinter dir und natürlich hat man den allerbesten Algorithmus gewählt, man ist ja nicht doof. Aber der soll natürlich auch noch möglichst schnell laufen. Daher Optimierung.



  • Für mich ist C++ im Gegensatz zu C eine Mehrparadigmensprache auf Systemebenen. Wenn es nicht anderes Sinn macht versuche ich mich auch in C oder auch C++. Spaß machen aber beide Sprachen nicht wirklich, es gibt einfach zu viel was einen von der eigentlichen Arbeit(Implementieren von Algorithmen, etc,) ablenkt.

    Am meisten Spaß macht mir derzeit Java mit Eclipse, da habe ich ganz wenig mit der Sprache selbst zu kämpfen und kann mich auf das Problemlösen konzentrieren.

    Aber das war ja auch nicht die Frage und fast jeder Entwickler programmiert eh mit unterschiedlichen Sprachen. Ich persönlich habe bis jetzt Kontakt gehabt mit: C, C++, PHP, Javascript, Python, Bash und Java.

    Hochoptimierte Software wurde noch nie verlangt und ich habe auch keinen Kollegen bis jetzt kennen gelernt, der so etwas abliefern musste. In meine Augen sind so etwas absolute Spezialfälle.



  • B4ndit schrieb:

    Für mich ist C++ im Gegensatz zu C eine Mehrparadigmensprache auf Systemebenen. Wenn es nicht anderes Sinn macht versuche ich mich auch in C oder auch C++. Spaß machen aber beide Sprachen nicht wirklich, es gibt einfach zu viel was einen von der eigentlichen Arbeit(Implementieren von Algorithmen, etc,) ablenkt.

    C++ hat mehr Algorithmen, als man in einem normalen Programm braucht. 🙄



  • Nathan schrieb:

    C++ hat mehr Algorithmen, als man in einem normalen Programm braucht.

    C++ hat sehr viele Algorithmen, die kein normales Programm braucht, aber es fehlen Algorithmen, die viele normale Programme brauchen würden.

    Trifft nicht nur auf Algorithmen, sondern auch auf Container und das IO-Gedöns zu.



  • Nathan schrieb:

    B4ndit schrieb:

    Für mich ist C++ im Gegensatz zu C eine Mehrparadigmensprache auf Systemebenen. Wenn es nicht anderes Sinn macht versuche ich mich auch in C oder auch C++. Spaß machen aber beide Sprachen nicht wirklich, es gibt einfach zu viel was einen von der eigentlichen Arbeit(Implementieren von Algorithmen, etc,) ablenkt.

    C++ hat mehr Algorithmen, als man in einem normalen Programm braucht. 🙄

    Die meisten C++-"Algorithmen" sind doch völlig triviale Schleifen. Deine Reaktion geht auch völlig an der Kritik von B4ndit vorbei, nämlich dass C++ die Aufmerksamkeit vom Wesentlichen ablenkt. Und damit hat er recht.



  • Hört hört...

    Dann mach doch Visual Basic und werd glücklich.



  • @Bitte ein Bit In meinem Fall ist es der SMO-Algorithmus zur Maximierung von quadratischen Problemen mit Box-Constraints. Da man in dem Algorithmus fundamental Speicherbandbreitenlimitiert ist, kann man dort durch Parallelisierung mehr als linearen Speedup erreichen(n cores => >n fach schneller). Die Schleife die ich da optimiert habe, war nicht wirklich teuer, durch Parallelisierung hat man da alleine nicht viel gewinnen können. Das Einzige was man gewann war, das durch das konsequente Teilen des Problems auf n Kerne der L1+L2 Cache eines Kerns in der Schleife nicht geflusht wurde. Das unnötige malloc mit dem cache miss tat dann schon weh. Mit VLA wäre das ein no-brainer gewesen, jetzt drufte ich mir überlegen, wie ich das pre-allokieren kann. Am Ende wurde es ein normales Array auf dem Stack mit recht großzügiger Dimensionierrung. Naja, muss ich mit leben.

    OpenMP selbst kostet fast nichts, das ist wirklich fix implementiert. Es ist ja auch dafür gedacht, relativ einfache Schleifen zu parallelisieren. Keine Panik, wir Benchmarken schon unsere Programme 😉



  • µ schrieb:

    Nathan schrieb:

    B4ndit schrieb:

    Für mich ist C++ im Gegensatz zu C eine Mehrparadigmensprache auf Systemebenen. Wenn es nicht anderes Sinn macht versuche ich mich auch in C oder auch C++. Spaß machen aber beide Sprachen nicht wirklich, es gibt einfach zu viel was einen von der eigentlichen Arbeit(Implementieren von Algorithmen, etc,) ablenkt.

    C++ hat mehr Algorithmen, als man in einem normalen Programm braucht. 🙄

    Die meisten C++-"Algorithmen" sind doch völlig triviale Schleifen. Deine Reaktion geht auch völlig an der Kritik von B4ndit vorbei, nämlich dass C++ die Aufmerksamkeit vom Wesentlichen ablenkt. Und damit hat er recht.

    Das kann ich jetzt aber nicht so ganz nachvollziehen. Bin ich betriebsblind oder seid ihr noch nicht fit in C++? Anfangs war ich trotz gesammelter Programmiererfahrung in anderen Sprachen von C++ überwältigt und wusste nicht, wie ich an was Design-technisch rangehen sollte. Aber das legt sich halt mit der Zeit, wenn dann die Sprache besser sitzt. Wo lenkt dich C++ denn gegenüber von C vom Problem ab? Vielleicht hast Du Nathan auch nicht ganz verstanden? Ich fühle mich z.B. vom Problem abgelenkt, wenn ich mir erst irgendwelche Datenstrukturen und Algorithmen-Bausteine selbst basteln muss, wenn ich mich darauf konzentrieren muss, diverse Resourcen manuell wieder freizugeben. Ich weiß nicht, wie repräsentativ das ist, was ich da für C Code gesehen habe, aber mir kommt das oft so vor, als würde da ständig das Rad neuerfunden. C an sich bietet kaum was an und anscheinend haben auch wenige Lust dazu, sich von anderen Bibliotheken abhängig zu machen. Vielleicht liegt es aber auch daran, dass C, was generische Programmierung angeht, schwach ist, so dass deswegen sich viele ihre Räder selbst nachbauen. Nee, ich denke nicht, dass ich betriebsblind bin. Ich empfinde C als eine eher unproduktive Sprache. Ich habe einfach keine Lust, mich bei der Wahl der Sprachmittel so beschränken zu müssen. Und ich nutze gerne die Dinge aus der C++ Standardbibliothek. Ich nutze gerne RAII aus. Ich mag Typsicherheit. Und ich mag nicht Dinge neu erfinden, die mir schon in der Standardbibliothek geboten werden. Das wäre doch verschenkte Zeit und lenkt ab.



  • Player894 schrieb:

    Kann mir das bitte jemand einmal genau aufdröseln, was man jetzt wie machen kann, wie die Sprachen [C und C++] zusammenhängen etc.?

    Viel zu unscharf, die Frage. Du kannst jetzt nicht erwarten, dass dir jemand dazu einen 3-Seiten-Aufsatz präsentiert. Wenn du konkrete Fragen hast, stell' sie.



  • @krümel
    Nun, ich weiß nicht warum Du jetzt C++ C gegenüberstellst. Davon war doch garnicht die Rede und hätte ich nur die Wahl zwischen C und C++, würde ich letzteres bedingungslos vorziehen.

    B4ndit schrieb, dass ihm beide Sprachen keinen Spaß machen und er mit Java sehr viel direkter zum wesentlichen Problemlösen kommen kann. Ich bin zwar kein Javaianer aber in C# merke ich es ebenfalls. C++ ist sicherlich keine schlechte Sprache, aber sie bürdet dem Programmierer sehr sehr viel mehr Randprobleme auf die es zu beachten gilt.
    Und gerade in perfektionsgetriebenen Foren sieht man immer wieder schön, wie die Beschätigung mit C++ zum reinen Selbstzweck verkommt.



  • Ok, da hat mich wohl das Thema vom Thema abgebracht. ^^

    C# ist glaub'ich ganz nett.


Anmelden zum Antworten