Frage

Vor kurzem habe ich angefangen, (nur ein bisschen) zu lesen aktueller Entwurf für den zukünftigen C++11-Standard.

Es gibt viele neue Funktionen, einige davon sind bereits über Boost Libs verfügbar.Natürlich bin ich sehr zufrieden mit diesem neuen Standard und möchte so schnell wie möglich mit allen neuen Funktionen spielen.

Wie auch immer, als ich mit einigen Freunden, langjährigen C++-Entwicklern, über diesen Entwurf sprach, kamen einige Bedenken auf.Deshalb bitte ich Sie (um sie zu beantworten):

1) Die Sprache selbst

Dieses Update ist riesig, vielleicht zu groß für ein einzelnes Standardupdate.Riesig für die Compiler-Anbieter (auch wenn die meisten von ihnen bereits mit der Implementierung einiger Funktionen begonnen haben), aber auch für die Endbenutzer.

Insbesondere sagte mir ein Freund: „Das ist eine Art neue Sprache".

  • Können wir es nach diesem Update als eine brandneue Sprache betrachten?
  • Planen Sie, auf den neuen Standard umzusteigen oder mit dem/den „alten“ Standard(s) Schritt zu halten?

2) Kenntnisse der Sprache

  • Wie wird sich der neue Standard auf die Lernkurve auswirken?
  • Wird es schwieriger, die Sprache zu lehren?
  • Einige Funktionen sind zwar ziemlich großartig, erscheinen mir aber etwas zu „akademisch“ (wie ich meine Definition).Liege ich falsch?
  • All diese Neuzugänge zu meistern, könnte ein Albtraum sein, nicht wahr?
War es hilfreich?

Lösung

Kurz gesagt, nein, können wir dies eine neue Sprache nicht in Betracht ziehen. Es ist die gleiche Sprache, neue Funktionen. Aber anstatt dass sie mit Hilfe des Boost-Libs verschraubt, sind sie jetzt Standard Einschlüsse gehen zu sein, wenn Sie einen Compiler verwenden, der den 0x-Standard unterstützt.

Eine nicht Haben den neuen Standard zu verwenden, während ein Compiler, der den neuen Standard unterstützt. Man wird lernen müssen, und den neuen Standard zu verwenden, wenn bestimmte Einschränkungen existieren auf der Software entwickelt wird, aber, aber das ist eine Einschränkung mit jeder Software bemühen. Ich denke, dass die neuen Features, die die 0x-Standard bringt wird bestimmte Dinge machen zu tun einfacher und weniger fehleranfällig, so dass es den eigenen Vorteil ist, zu lernen, was die neuen Features sind, und wie sie ihre Design-Strategie verbessern für die künftige Arbeit. Man wird es auch lernen, so dass, wenn sie auf eine Software entwickelt, damit zu arbeiten, werden sie verstehen, was los ist und keine großen boo-Boos machen.

Zur Frage, ob ich „ Umstellung auf den neuen Standard “, wenn das bedeutet, dass ich den neuen Standard lernen und verwenden, soweit erforderlich und wo es meine Produktivität erhöht, dann ja, ich sicher Plan Schalter . Wenn dies jedoch bedeutet, dass ich Grenze mich nur mit den neuen Funktionen des 0x-Standard arbeitet, dann nein, da ein großer Teil meiner Arbeit Code vor dem Standard geschrieben beinhaltet, und es wäre ein kolossales Unternehmen sein Redesign alles, um die neuen Funktionen zu nutzen. Nicht nur das, es kann aber neuen Bugs und Performance-Probleme vorstellen, die ich bin mir nicht bewusst ohne Erfahrung.

Learning C ++ ist seit jeher eine der schwierigeren Strecken kann ein Programmierer übernehmen. Das Hinzufügen von neuen Funktionen der Sprache wird nicht die Schwierigkeit ändern lernen die Syntax und wie es effektiv zu nutzen, aber der Ansatz wird sich ändern. Die Menschen werden lernen noch über Zeiger und wie sie funktionieren, aber sie werden auch über intelligente Zeiger lernen und wie sie es geschafft sind. In einigen Fällen werden die Menschen Dinge anders als zuvor. Zum Beispiel müssen die Menschen immer noch lernen, wie die Dinge zu initialisieren, aber jetzt werden sie über Uniform Initialisierung lernen und Initializer Listen als primäre Möglichkeiten, Dinge zu tun. In einigen Fällen werden vielleicht Verständnis Dinge einfacher mit dem Zusatz der neuen Syntax für Bereiche oder den Auto-Rückgabetyp in einer Funktionsdeklaration. Ich denke, dass insgesamt, C ++ einfacher wird, zu erlernen und zu verwenden, während gleichzeitig immer einfacher zu unterrichten.

Die Beherrschung einer Sprache ist ein langfristiges Ziel, es kann nicht über Nacht geschehen. Es ist dumm zu denken, dass man die Herrschaft über etwas so komplex wie C ++ schnell haben kann. Es braucht Übung, Erfahrung und Debugging-Code, um wirklich etwas in hämmern. Academically Lernen ist eine Sache, aber dieses Wissen zu nutzen Putting ist ein ganzes anderes Monster. Ich glaube, wenn man schon die Beherrschung der Sprache C ++ ist, werden nicht die neuen Konzepte darstellen zu viel von einer Last, sondern ein Neuling kann den Vorteil, dass haben sie nicht einige der veralteten Formen der Mühe zu lernen, Dinge zu tun .

Andere Tipps

1) Die Sprache selbst

Soweit mir bekannt ist, gibt es wirklich keine Bruch Änderungen zwischen C ++ 03 und C ++ 0x. Das einzige, was ich denken kann hier bezieht sich auf die Verwendung auto als Speicherklassen-Bezeichner, aber da es keine semantische hatte was bedeutet, ich sehe ein Problem nicht zu sein.

Es gibt eine Menge von anderen akademischen Behebungen zum Standard der sehr beliebt sind necssary, zum Beispiel bessere Beschreibungen für das Layout des Mitglieds Daten. Schließlich mit Multi-Core / CPU-Architekturen zur Norm, das Speichermodell Festsetzung wurde ein Muss.

2) Die Kenntnis der Sprache

Ich persönlich das Gefühl, dass für 99,9% der C ++ Entwickler die neuere Sprache zu verwenden, um einfacher sein wird. Ich denke speziell von Funktionen wie Auto, Lambda ist und constexpr. Diese Funktionen sollten wirklich die Sprache angenehmer machen werden.

Bei einer höheren Ebene, haben Sie andere Funktionen wie variadische Vorlagen usw., die die fortgeschrittenen Benutzer.

Hilfe

Aber es gibt nichts Neues, ich bin immer noch überrascht von der Menge an Alltags C ++ Entwickler, die nicht verwendet haben (oder sogar gehört) die STL.

Aus persönlicher Sicht ist die einzige Funktion, die ich ein wenig besorgt bin über in der neuen Norm ist, dass die Begriffe. Da es eine so große Veränderung ist, die gleichen Probleme, die mit Vorlagen aufgetreten ist (dh. Vollständig gebrochen Implementierungen) ist eine reale Gefahr.

Update Post FDIS zur Abstimmung Ausgehen:

Wie es passiert, ‚Konzepte‘ wurde für C ++ 0x fallen gelassen und wird wieder für C ++ 1x aufgenommen werden. Am Ende gibt es einige Änderungen außer auto, die Ihren Code brechen könnte, aber in der Praxis werden sie wahrscheinlich ziemlich selten sein. Die wichtigsten Unterschiede sind in Anhang C.2 der

Für mich wird eines der wichtigsten sein:

unique_ptr + std::move() !

Vorstellen:

  1. Smart Pointer ohne Overhead:

    • keine Referenzzähloperationen
    • kein zusätzlicher Speicher für Referenzzählervariable
  2. Intelligenter Zeiger, der sein kann gerührt, dh.Beim Verschieben gibt es keine Destruktor-/Konstruktoraufrufe

Was bringt Ihnen das? Außergewöhnlich sichere, günstige (Zeiger...) Behälter ohne jegliche Kosten.Der Container kann nur memcpy() unique_ptrs ausführen, sodass kein Leistungsverlust durch das Umschließen eines regulären Zeigers durch einen intelligenten Zeiger entsteht!Also noch einmal:

  1. Sie können Zeiger verwenden
  2. Es wird sicher sein (keine Speicherlecks)
  3. Es kostet Sie nichts
  4. Sie können sie in Containern aufbewahren und sie können damit kostengünstig „große“ Bewegungen (wie bei Memcpy) durchführen.
  5. Es wird ausnahmesicher sein

:)

Eine andere Sicht:

  1. Wenn Sie eine Gruppe von Objekten mit copy() verschieben, gibt es tatsächlich einen Konstruktor- und Destruktoraufruf für jede Objektinstanz.Wenn Sie 1000 Objekte mit einer Größe von 1 KB kopieren, gibt es mindestens ein memcpy() und 2000 Funktionsaufrufe.
  2. Wenn Sie Tausende von Aufrufen vermeiden möchten, müssen Sie Zeiger verwenden.
  3. Aber Hinweise sind:gefährlich usw.Tatsächliche intelligente Zeiger helfen Ihnen nicht, sie lösen andere Probleme.
  4. Es gibt vorerst keine Lösung.Sie müssen von Zeit zu Zeit für das C++ RAII/Pointer/Valuevars-Design bezahlen.Aber mit C++0x ermöglicht die Verwendung von unique_ptr „massive“ Bewegungen von Objekten (ja, praktisch von Objekten, weil der Zeiger intelligent ist) ohne „massive“ Konstruktor-/Destruktoraufrufe und ohne das Risiko der Verwendung von Zeigern! Für mich ist das wirklich wichtig.

Es ist so, als würde man das RAII-Konzept (aufgrund der Verwendung von Zeigern) lockern, ohne die Vorteile von RAII zu verlieren.Ein anderer Aspekt:Der in unique_ptr() eingeschlossene Zeiger verhält sich in vielerlei Hinsicht ähnlich wie die Java-Referenzobjektvariable.Der Unterschied besteht darin, dass unique_ptr() jeweils nur in einem Bereich existieren kann.

Ihr Freund ist teilweise richtig, aber meist falsch: es ist die gleiche Sprache mit zusätzlichen Funktionen

.

Die gute Sache ist, Sie müssen nicht alle neuen Funktionen meistern. Einer der wichtigsten Mandate für einen Standardkörper ist nicht vorhandene Code zu brechen, so dass Sie werden in der Lage sein zu gehen, glücklich in Ihrem alten Stil-Codierung (Ich bin immer noch hauptsächlich ein C-Coder, obwohl ich „C ++“ Anwendungen: -).

Nur wenn Sie wollen einen Blick auf die neuen Funktionen haben, werden Sie an den Knochen müssen die Veränderungen auf. Dies ist ein Prozess, den Sie über Jahre erstrecken kann, wenn es sein muss.

Mein Rat ist, zu lernen, was alle neuen Funktionen auf hohem Niveau sind (wenn auch nur in Vorstellungsgesprächen kenntnisreich klingen), aber die Details langsam lernen.

In gewisser Hinsicht, C ++ 0x sollte einfacher sein, lehren / lernen als die aktuelle C ++:

  • Looping durch einen Behälter - die neue for Syntax ist viel einfacher als for_each + Funktors oder Looping manuell Iteratoren mit
  • Initialisiere Behälter: wir in der Lage sein werden Sequenzen mit der gleichen Syntax wie Arrays zu initialisieren
  • Speicherverwaltung: aus geht zwielichtige alte auto_ptr, kommt gut definierte unique_ptr und shared_ptr

Lambdas, obwohl notwendigerweise komplexer als andere Sprachen Äquivalente, wird es leichter lernen als die C ++ 98 Prozessfunktion Objekte in einem anderen Bereich zu definieren.

Möchten Sie auf den neuen Standard wechseln planen oder mit dem "alten" Standard halten (s)?

Vor einem Jahr schrieb ich strenge C89, weil das betreffende Produkt auf Embedded-Plattformen aggressiv tragbar war, von denen einige Compiler hatte mit radikal unterschiedliche Vorstellungen davon Bits C99 unterstützt es wert ist. So ein 20-jähriger Standard hat mich noch nicht vollständig von seinem 10-jährigen Nachfolger ersetzt.

So erwarte ich nicht in der Lage sein, um wegzukommen von C 03 ++ jederzeit schnell.

Ich erwarte C ++ 0x Funktion zu nutzen, wo angemessen. So wie ich C99 Funktionen in C-Code und gcc-Erweiterungen in C und C ++ (und würde MSVC Erweiterungen verwenden, obwohl ich nie mehr auf MSVC-Code nur als triviale Mengen an Zeit gearbeitet habe). Aber ich erwarte, dass es „nice to have“ sein, anstatt Grundlinie, so ziemlich auf unbestimmte Zeit.

Sie haben einen Punkt, aber es ist immer der Fall gewesen. Es gibt eine Menge von C ++ Code aus, dass es immer noch nichts von dem '98-Standard nicht übernehmen, nur weil des angeborenen Konservatismus einiger Programmierer. Einige von uns erinnern, eine dunkele Zeit vor dem std:: Namensraum (vor Namespaces, in der Tat), wenn jeder seine eigene String-Klasse geschrieben und Zeiger ging nackt herum die ganze Zeit. Es gibt einen Grund, warum wir über „modernen C ++ Stil“ sprechen -. Aus dem früheren Stil zu unterscheiden, weil einige Leute behaupten müssen noch oder Update-Code in diesem Stil

Jede Sprache, um zu überleben zu entwickeln hat, und jede Sprache, die eine geteilte Nutzerbasis hat sich entwickelt, wenn auch nur, weil die Menschen in ihrer Haltung variieren zu Opportunitätskosten Schätzung bei der Anwendung der neue Sprach-Features, um ihre eigenen Arbeit.

Mit dem Aufkommen von C ++ 0x in Versand Compiler, wird dieses Gespräch über und über in der ganzen Welt in dev Teams gespielt werden:

YOUNGSTER: Ich habe gerade entdeckt, diese Dinge genannt lambdas! Und ich finde viele Möglichkeiten, sie zu nutzen, um unseren Code ausdrucksvoller zu machen! Schau mal, schrieb ich Ihre alte Foo Klasse, ist nicht so viel sauberere?

Oldster: Es gab nichts falsch mit meiner alten Foo-Klasse. Sie suchen nur nach Ausreden unnötig eine „cool“ neue Funktion zu nutzen. Warum halten Sie versuchen, mein Leben so kompliziert zu machen? Warum erhalte ich neue Dinge zu lernen, die? Wir brauchen einen neuen Krieg, das ist, was wir brauchen.

YOUNGSTER: Sie sind nur zu stecken in deinem Weg, alten Mann, sollten wir nicht einmal C verwenden ++ in diesen Tagen ... wenn es nach mir ginge -

Oldster: Wenn es nach mir ist, dass wir mit PL / 1 stecken haben würden, aber nein ... meine Frau für Carter wählen hatte und jetzt sind wir mit all diesem objektorientierten Mist stecken. Es gibt nichts, was man mit std::transform tun kann, und Lambda-Ausdrücke, die ich nicht mit einem goto und ein paar Etikett tun kann.

etc.

Ihre Karriere als Programmierer immer beinhalten Lernen und Umlernen. Sie können nicht erwarten, dass C ++ die gleiche bleiben, bis Sie in Rente gehen und die gleichen Methoden und Praktiken zu verwenden, die Sie vor 40 Jahren verwendet haben. Technologie rollt und rollt schnell. Es ist Ihre Aufgabe mit ihm Schritt zu halten. Natürlich können Sie das ignorieren und weiterhin die gleiche Art und Weise arbeiten Sie derzeit tun, aber in 5/10 Jahren Sie werden so veraltet, dass Sie das alles dann zu lernen gezwungen werde, wenn Sie versuchen, Arbeit zu ändern . Und es wird viel einfacher gewesen, bei der Arbeit zu lernen, all die Jahre zuvor:)

Vor ein paar Monaten hörte ich Bjarne Stroustrup einem Vortrag gibt den Titel 50 Jahre C ++ . Zugegeben, ich bin kein C ++ Programmierer, aber es schien mir, dass er schon gar nicht 0x denkt eine neue Sprache ist!

Unabhängig davon, ob wir es eine „neue Sprache“ betrachten kann, denke ich, das ist Semantik. Es macht keinen Unterschied machen. Es ist rückwärts kompatibel mit unserem aktuellen C ++ Code, und es ist eine bessere Sprache. Unabhängig davon, ob wir es für „die gleiche Sprache“ spielt keine Rolle.

Über die Sprache zu lernen, denken Sie daran, dass viele der neuen Features gibt es die Sprache machen leichter zu erlernen und anzuwenden. Die meisten Funktionen, die Komplexität sind nur für Bibliothek Entwickler gedacht. Sie können diese neuen Funktionen nutzen, um bessere, effizientere und einfachere Bibliotheken zu verwenden, das Sie dann ohne zu wissen, über die Funktionen nutzen können. Einige der Änderungen tatsächlich vereinfachen und bestehende Funktionen verallgemeinern, so dass sie leichter für Einsteiger zu lernen.

Es ist ein großes Update, ja, aber es wird von einem Jahrzehnte Erfahrung mit dem aktuellen C ++ Standard geführt. Jede Änderung ist es, weil die Erfahrung hat gezeigt, dass es notwendig ist. In der Tat ist der Ausschuß ist sehr vorsichtig und konservativ, und hat eine große Anzahl von anderen Sprechen Verbesserungen abgelehnt. Was angefügt ist hier nur die Grundlagen, dass 1) alle einigen konnten, und 2) konnte in der Zeit spezifiziert werden, ohne den neuen Standard zu verzögern.

Es ist nicht einfach ein paar Sprachdesigner Hinsetzen und neue Funktionen Brainstorming sie möchte versuchen.

Konzepte und Concept Maps werden zu stark die grokability des Template-Frameworks zu erhöhen. Wenn Sie jemals über die Boost-Quelle gegossen haben, wissen Sie, was ich meine. Du wirst ständig von der Quelle zum docs, weil die Sprache einfach nicht die Einrichtungen müssen Vorlage Konzepte auszudrücken. Hoffentlich Konzepte + Duck Typing wird uns das Beste aus beiden Welten, wobei Einspeisepunkte auf Template-Bibliotheken explizit Anforderungen erklären kann, aber immer noch die Freiheit hat, die Duck Typing bereitstellt, wenn generischen Code zu schreiben.

Es gibt viele gute Dinge in C ++ 0x, aber sie sind meist evolutionäre Veränderungen, die bestehenden Ideen zu verfeinern oder erweitern. Ich glaube nicht, es anders genug, eine „neue Sprache“ zu rechtfertigen, sie rufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top