Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
C++Warum ist C++ oft eine 'gehasste' Programmiersprache?
@antred
Siehst du, daß ist genau was ich meine.
Variablendefinitionen gehören an den Anfang eines Blockes, besser noch einer Methode/Funktion. Das erhöht nicht nur die Lesbarkeit, das verhindert auch Verdeckung.
Mit dieser Meinung stehst du in C++ in direktem Konflikt mit "best practice". Alle Variablendeklarationen am Beginn einer Funktion zu sammeln war früher mal der alte C-Weg (meines Wissens ist das inzwischen selbst in modernem C überholt), aber in heutigem C++ hat so ein Unsinn nichts verloren.
@miac:
Warum sollte ich mir einen unsigned int am Anfang einer Funktion deklarieren, wenn ich ihn in einer For-Schleife (im Schleifenkopf) deklarieren kann, und der Speicher, die die Variable brauch, nach der For-Schleife automatisch wieder geleert wird, was bei einer Variable am Anfang einer Funktion/eines Blocks eben nicht so ist, da diese bis zum Ende des Blocks den Speicher (unnötigerweise) verbraucht/belegt. - Ich hoffe, ich habs gerade in einem mehr oder minder guten Deutsch verfasst.
Also eine Variable in einem For-Schleifen-Kopf "lebt" meistens nicht so lange, wie eine Variable definiert am Anfang einer Funktion -> der Speicher wird früher freigegeben.
@Tersus:
Ich kann dir mit Sicherheit sagen, dass die Programmierer, die diese Aussagen getätigt haben, nicht schlecht und auch nicht faul sind.
Das kann man interpretieren, dass jeder, der C++ nicht mag, kein Profi ist, oder, dass jeder Profi C++ (und vllt andere Programmiersprachen auch noch) mag.
Warum ist Mohammed eigentlich bei Christen so unbeliebt? Die meisten Moslems, mit denen ich so geredet habe, fanden der war eigentlich ein feiner Kerl.
Wieso sollte C++ eine gehasste Programmiersprache sein?
Ich würde C++ C jeder Zeit vorziehen, es sei denn es geht um hohe Performance, geringen Speicherverbrauch oder ähnliches.
Es mag vielleicht Dinge geben, wo C++ schneller ist bzw. weniger Speicher verbraucht, im Durchschnitt wird da C aber immer vorn liegen.
Ich habe es schon in mehreren Fällen selbst getestet. Wenn es keinen Unterschied gibt, liegt es entweder am Compiler oder daran, dass man bei C++ C Code verwendet hat.
Du kannst es ja selbst einmal testen. Ich hatte das damals in einer Excel-Tabelle festgehalten, nur finde ich sie nicht sonst hätte ich sie mal angehängt.
Wenn es da Unterschiede gab, dann lag das entweder an der Qualität der jeweiligen Compiler oder daran, daß die C-Lösung besser/schlechter umgesetzt war als die C++-Lösung. Mir fallen genau 0 technische Gründe ein, weshalb C irgend wie schneller sein sollte als C++. Wenn du Gründe kennst, würde ich die gerne hören.
Der Vorteil von C++ besteht darin, dass man sich aussuchen kann, ob man ein etwas höheres Abstraktionsniveau oder maximale Performance haben möchte.
Das heißt im Klartext: In kritischen Code-Abschnitten kann man C-Code schreiben, der maximale Performance liefert, überall anders kann man auf komfortablere Funktionen zugreifen, wobei selbst diese oftmals sehr gut Implementiert sind und oftmals sogar "Eigenkreationen" in C locker in die Tasche stecken was Effizienz angeht. (Beispielsweise std::vector).
Wenn man sich auskennt ist C++ eine wirklich sehr mächtige Programmiersprache die sogut wie alles kann, leider schleppt sie wie bereits erwähnt einige Altlasten mit sich herum die aufgrund der Kompatibilität zu älteren Programmen nicht mehr entfernt werden können. Unerfahrene Programmierer werden allerdings mit C++ sehr wahrscheinlich fehleranfälligere und sogar langsamere Software schreiben als mit Java oder C#, da es doch schon einige Fallen gibt (Typische Beispiele: Call by Value, Stack vs Heap Allocation, etc.).
Nach Tiobe-Index (http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html) liegt C mit 17.655% deutlich vor C++ mit 4.868%. Zumindest gilt die Aussage das C stärker nachgefragt bzw. eingesetzt wird.
Bzgl. Geschwindigkeit bin der Meinung, dass gut umgesetzte C++ - Algorithmen idR. an entsprechenden C Umsetzungen vorbeiziehen. Grund hierfür ist gerade das höhere Abstraktionsniveau, welches den Optimierer mehr Freiraum läßt. Ist doch richtig cool, schönen Source und gute Geschwindigkeit/ Speicherbedarf,.. Mit C bekommt sicher auch schnellen Code hin, aber schön ist dieser idR. nicht.
@togepi: Wenn C++ nur Vorteile hätte, warum wäre es aber dann eben so "gehasst", warum würden es gerne viele meiden und warum ist C dann mehr gefragt als C++?
@convexus: Danke für die Links
Aber warum sollte man mit C keinen schönen Code hinbekommen? Klar geht das auch,..
Natürlich nicht. Programmiersprachen sind zu verschiedene Zeiten und für verschiedene Anwendungszwecke entstanden, daher entschieden sich viele fundamental.
Objekte gibts z.B. in C nicht, was gerade bei großen Projekekten sehr sinnvoll ist.
C ist halt klassich zum maschinennahen Schreiben konzipiert.
@togepi: Wenn C++ nur Vorteile hätte, warum wäre es aber dann eben so "gehasst", warum würden es gerne viele meiden und warum ist C dann mehr gefragt als C++?
@convexus: Danke für die Links
Aber warum sollte man mit C keinen schönen Code hinbekommen? Klar geht das auch,..
Das hat mehrere Gründe. C ist weit vor C++, da für Embedded Systems oftmals C zum Einsatz kommt. Das liegt unter anderem daran, dass C Compiler wesentlich einfacher zu bauen sind und quasi immer zur Verfügung stehen. Außerdem reicht hier C oftmals schlichtweg aus und viele Features von C++ wären dann vielleicht doch zu teuer aufgrund der sehr stark limitierten Ressourcen.
Bei größeren Systemen (Desktops, Tablets, etc.) hingegen verliert C++ an Boden, weil die Rechenleistung immer mehr ansteigt und der Performanzvorteil schlichtweg egal ist. Wenn z.b. eine Java Applikation 200MB RAM verbraucht und eine C++ Version nur 2MB dann sagt man sich "Wen interessierts?", bei den Speichermengen heutzutage ist das quasi irrelevant. Dabei lassen sich mit C# und Java oftmals schneller Programme entwickeln, weil man sich weniger an Kleinigkeiten aufhalten muss und weniger Fehler machen kann.
Dennoch wird man feststellen, dass die viele"Profianwendungen" auch heute noch in C++ geschrieben sind. (Sogut wie alle Windows Standardprogramme, soetwas wie Photoshop, Gimp, Autodesk Maya, Visual Studio, Webbrowser, ...)
Ich persönlich verstehe den Hass gegenüber C++ nicht, ich finde es ist eine schöne Sprache die grade Aufgrund der höheren Komplexität mehr Spaß bereitet! Java ist dagegen doch totlangweilig. Viele Studenten scheinen da meine Meinung aber nicht zu teilen und zukünftig wird C++ vermutlich weiter an Bedeutung verlieren, da Ressourcen im Überfluss vorhanden sind.
Das hat mehrere Gründe. C ist weit vor C++, da für Embedded Systems oftmals C zum Einsatz kommt. Das liegt unter anderem daran, dass C Compiler wesentlich einfacher zu bauen sind und quasi immer zur Verfügung stehen. Außerdem reicht hier C oftmals schlichtweg aus und viele Features von C++ wären dann vielleicht doch zu teuer aufgrund der sehr stark limitierten Ressourcen.
Selbst wenn man auf einem embedded system arbeitet, gibt es rein logisch eigentlich nur 2 Totschlagargumente, weshalb man C gegenüber C++ den Vorzug geben sollte:
Es gibt für die jeweilige Plattform keinen gescheiten C++-Compiler.
Im Entwicklerteam gibt es kaum C++-Knowhow.
Wenn man befürchtet, daß einige Features von C++ (oder Teile der C++-Standardbibliothek) zu kostspielig sein könnten, kann man diese ja einfach meiden, aber dennoch all die anderen Vorteile der Sprache nutzen.
Wobei ich mich natürlich schon frage, welche Sprach-Features von C++ in irgend einer Weise kostspieliger sein sollten als eine funktional äquivalente C-Umsetzung. Zum Beispiel ist zwar mit virtuellen Methoden ein gewisser Overhead verbunden (1 vtable pro Klasse + 1 vtable-Pointer pro Instanz), aber wenn man Polymorphie in C umsetzen wollte, müßte man sich dort einen ähnlichen Mechanismus (z.B. über Funktionszeigertabellen) selbst basteln, der dann vergleichbaren Overhead mit sich brächte.
@pizza4ever: Auch wenn OO bei großen Projekten einfacher und von der Speicherverwaltung her sicherer ist, sieht man ja immernoch viele Anwendungen, die in C programmiert sind - auch neue Projekte. (nicht nur alte Projekte, die nur gewartet werden),.. Warum dann aber C und nicht C++?
@togepi: Für kleinere Projekte ist es durchaus Sinnvoll auf Java oder C# zurück zu greifen, da man sich dort wahrscheinlich ein paar Stunden programmieren spart. Bei größeren Projekten allerdings ist Performance immernoch sehr wichtig. (abgesehen von Systemprogrammierung)
Was bringt dir das beste Spiel, wenn es 10GB RAM braucht und dein übertakteter i7 im Menü schon bei 60% Auslastung ist?
Und viele Leute kaufen sich nicht alle 2 Jahre einen neuen Rechner mit 16GB RAM - da merkt man bei 4GB RAM im System deutlicher den Unterschied von 200MB zu 2MB RAM. Genauso verhält es sich ja auch zu Prozessoren - nicht jeder hat einen i5 oder FX8350, nur um 2 CDs gleichzeitig zu beschreiben,...
Ich selber bin der Meinung, dass man die Wichtigkeit der Performance von Software nicht unterschätzen sollte, es soll am Schluss ja überall ohne große Macken laufen, und nicht bei 80% CPU-Auslastung wenn man ein 2min-Video im VLC anschauen will.
Alle Variablendeklarationen am Beginn einer Funktion zu sammeln war früher mal der alte C-Weg (meines Wissens ist das inzwischen selbst in modernem C überholt), aber in heutigem C++ hat so ein Unsinn nichts verloren.
Mit Unsinn hat das nichts zu tun, sondern mit Übersicht und zur Fehlervermeidung. Es geht eben nicht darum, was man machen kann, sondern wie man es machen sollte.
Viele Sprachen erlauben das aus gutem Grund nicht.
Und das war nur ein Beispiel. Da sieht man, wie schwierig es ist, von solchen Gewohnheiten wieder weg zu kommen.
Es gibt viele - oft ältere - c-Programmierer, die in c++ einfach den alten Trott weiter verfolgen und im Kern c programmieren. Das kann man natürlich machen, kotzt aber die etwas an, die in echtem c++ fit sind. Daher kommen auch viele Irrungen und Wirrungen.
Mit Unsinn hat das nichts zu tun, sondern mit Übersicht und zur Fehlervermeidung. Es geht eben nicht darum, was man machen kann, sondern wie man es machen sollte.
Viele Sprachen erlauben das aus gutem Grund nicht.
Was ist bitte übersichtlich daran, alle Variablen oben in der Funktion zu deklarieren, also quasi so weit weg wie möglich vom Punkt ihrer ersten Verwendung?
Oftmals macht es das auch unmöglich, Deklaration und Definition in einem Schritt zu erledigen, da der Initialwert zu diesem Zeitpunkt noch nicht verfügbar ist. Für Objekte mit einem nicht trivialen Default-Konstruktor wäre das sogar ineffizient, da diese dann erst mal völlig um sonst default-initialisiert werden, während sie bei später erfolgender Initialisierung gleich über den korrekten Konstruktor initialisiert werden könnten. Bei einigen Klassen ist das sogar schlicht unmöglich. Wie würdest du z.B. ein std::lock_guard ganz oben in der Funktion deklarieren, wenn scoped_lock explizit darauf baut, daß der Programmierer es genau auf die Lebensdauer beschränkt, für die der referenzierte Mutex gelockt werden soll?
Viele Symbole, die ihren Initialwert nicht mehr ändern würden - also const sein könnten - können mit deiner Methode auch nicht const sein, da der Initialwert wie schon erwähnt so früh eventuell noch nicht bekannt ist.
Außerdem verpestest du den scope mit haufenweise Variablen, die eigentlich nur in einem viel kleineren Scope benötigt werden.
Ergänzung ()
P.S. Welche Sprachen erlauben so was denn nicht? Mir persönlich ist solch eine Sprache nicht bekannt (was natürlich nicht heißen soll, daß es sie nicht gibt).
Mit Unsinn hat das nichts zu tun, sondern mit Übersicht und zur Fehlervermeidung. Es geht eben nicht darum, was man machen kann, sondern wie man es machen sollte.
Viele Sprachen erlauben das aus gutem Grund nicht.
Und das war nur ein Beispiel. Da sieht man, wie schwierig es ist, von solchen Gewohnheiten wieder weg zu kommen.
Was du schreibst ist völliger Unsinn und ich kann da antred nur zustimmen. Entgegen deiner Behauptung ist es eben in C++ Best Practice Variablen immer im kleinstmöglichen Scope zu definieren!
Es hat keinerlei Vorteile oder dient der Übersicht, wenn alle Definitionen immer am Scope-Anfang stehen.
antred schrieb:
P.S. Welche Sprachen erlauben so was denn nicht? Mir persönlich ist solch eine Sprache nicht bekannt (was natürlich nicht heißen soll, daß es sie nicht gibt).
Der Tiobe-Index gibt nicht an wie gut eine Sprache ist, sondern wie oft danach im Internet gesucht wird, Stellenanzeigen usw.
Würde man von allen Programmen weltweit ausgehen, wäre C bestimmt bei 80 - 90%. Danach würde C++ mit 5 - 10% kommen. Dann kommt ersteinmal eine ganze Weile nichts und als nächstes vermutlich Java.