Verkaufen Sie mich auf const Korrektheit

Lesezeit: 10 Minuten

Verkaufen Sie mich auf const Korrektheit
Jason Baker

Warum genau wird also immer empfohlen, const so oft wie möglich zu verwenden? Es scheint mir, dass die Verwendung von const in C++ eher ein Schmerz als eine Hilfe sein kann. Aber andererseits komme ich hier aus der Python-Perspektive: Wenn Sie nicht möchten, dass etwas geändert wird, ändern Sie es nicht. Nachdem dies gesagt wurde, hier ein paar Fragen:

  1. Es scheint, als ob ich jedes Mal, wenn ich etwas als konstant markiere, eine Fehlermeldung erhalte und irgendwo eine andere Funktion ändern muss, um auch konstant zu sein. Das führt dann dazu, dass ich umsteigen muss Ein weiterer woanders funktionieren. Ist das etwas, das mit der Erfahrung immer einfacher wird?

  2. Sind die Vorteile der Verwendung von const Ja wirklich genug, um den Ärger zu kompensieren? Wenn Sie nicht beabsichtigen, ein Objekt zu ändern, warum schreiben Sie dann nicht einfach Code, der es nicht ändert?

Ich sollte anmerken, dass ich mich zu diesem Zeitpunkt am meisten auf die Vorteile der Verwendung von const für Korrektheits- und Wartbarkeitszwecke konzentriere, obwohl es auch schön ist, eine Vorstellung von den Auswirkungen auf die Leistung zu haben.

  • 8 Jahre alte Retrospektive, aber.. Wie wäre es, wenn Sie Ihren Code 100x beschleunigen (live gesehen)?

    – Lorro

    29. Juli 2016 um 10:07 Uhr

1646938815 269 Verkaufen Sie mich auf const Korrektheit
Jordan Parmer

Dies ist der definitive Artikel über “konstante Korrektheit”: https://isocpp.org/wiki/faq/const-correctness.

Kurz gesagt, die Verwendung von const ist eine gute Übung, weil …

  1. Es schützt Sie vor versehentlicher Änderung von Variablen, die nicht geändert werden sollen,
  2. Es schützt Sie vor versehentlichen Variablenzuweisungen und
  3. Der Compiler kann es optimieren. Sie sind zum Beispiel davor geschützt

    if( x = y ) // whoops, meant if( x == y )
    

Gleichzeitig kann der Compiler effizienteren Code generieren, da er jederzeit genau weiß, welchen Zustand die Variable/Funktion haben wird. Wenn Sie engen C++-Code schreiben, ist dies gut.

Sie haben Recht damit, dass es schwierig sein kann, const-correctness konsistent zu verwenden, aber der Endcode ist präziser und sicherer zu programmieren. Wenn Sie viel in C++ entwickeln, zeigen sich die Vorteile schnell.

  • Ich bin immer davon ausgegangen, dass Konstantenwerte frei zwischengespeichert werden können und somit viele Parallelitätsprobleme vermeiden oder die Geschwindigkeit verbessern können. Ist das wahr?

    – Philipp H

    26. September 2013 um 21:26 Uhr

  • Sicher. const Variablen kann Verbessern Sie die Geschwindigkeit in dem Sinne, dass der Compiler optimalen Code generieren kann, da er die volle Absicht und Verwendung der Variablen kennt. Werden Sie den Unterschied bemerken? Nun, das ist bei Ihrer Bewerbung umstritten. In Bezug auf die Parallelität sind const-Variablen schreibgeschützt, was bedeutet, dass keine exklusiven Sperren für diese Variablen erforderlich sind, da der Wert immer gleich ist.

    – Jordan Parmer

    26. September 2013 um 22:21 Uhr

  • Ab C++11 übernimmt auch die Standardbibliothek const Thread-sicher zu bedeuten und Ihren eigenen Code auf diese Weise zu behandeln, erleichtert die Suche nach möglichen Multi-Threading-Problemen und ist eine einfache Möglichkeit, API-Garantien für Ihre API-Benutzer bereitzustellen.

    – pmr

    25. März 2014 um 20:44 Uhr

  • Für mich ist einer der größten Mehrwerte der const-Korrektheit, dass Sie einfach durch Betrachten von Funktionsprototypen wissen, wann Zeiger auf Daten verweisen, die niemals von der Funktion verändert werden (dh nur Eingabe).

    – vgl. engr

    27. Januar 2017 um 17:03 Uhr

  • Vergiss nicht, dass es das gibt logisch und körperlich Konstanz. Jedes enthaltene Aggregatobjekt, das als änderbar gekennzeichnet ist, kann sich ändern, obwohl die Kennzeichnung als solche impliziert, dass es nichts mit der logischen Konstanz des enthaltenden Objekts zu tun hat.

    – Adrian

    19. März 2018 um 21:32 Uhr

1646938816 868 Verkaufen Sie mich auf const Korrektheit
Doug T.

Hier ist ein Stück Code mit einem häufigen Fehler, vor dem Sie die const-Korrektheit schützen kann:

void foo(const int DEFCON)
{
   if (DEFCON = 1)     //< FLAGGED AS COMPILER ERROR! WORLD SAVED!
   {
       fire_missiles();
   }
}

  • Wir sagen also, dass const notwendig ist, weil ein verdammter Idiot “=” als Zuweisungsoperator in C gewählt hat? 😉

    – Steve Jessop

    26. September 2008 um 1:05 Uhr

  • Natürlich warnen die meisten modernen Compiler vor Zuweisungen in Bedingungen und wir alle schalten das Flag „Warnungen als Fehler behandeln“ ein, richtig :->

    – Jack Bolding

    26. September 2008 um 1:06 Uhr

  • Seien Sie nicht zu streng mit diesem Beispiel: Dies ist dasselbe Beispiel, das von einigen Entwicklern evangelisiert wurde, um uns davon zu überzeugen, if(0 ==i) anstelle von if(i == 0) zu verwenden. Endlich kann Dougs Codemuster außerhalb der “if”-Anweisung verwendet werden. Wichtig ist, dass es einen der Vorteile von const auf humorvolle Weise zeigt. + 1.

    – Paercebal

    11. Oktober 2008 um 20:45 Uhr

  • @Roger Sie gehen davon aus, dass wir in einer Welt leben, in der Builds sauber und warnungsfrei sind. Meine Erfahrung ist, dass in vielen Codes Warnungen im Rauschen untergehen. Außerdem gibt es eine Menge Code, der Zuweisungen im if-Ausdruck vornimmt, und viele werden argumentieren, dass dies ein gültiger, “guter” Stil ist.

    – Doug T.

    16. März 2010 um 15:51 Uhr

  • Das löst das Problem nicht. Das Einwerfen eines Fehlers ist hier nur ein Nebeneffekt der Konstanz; es wird Sie nicht retten, wenn eine Variable änderbar sein muss. Dasselbe gilt für das (1 == x)-Muster; Es wird Sie nicht retten, wenn Sie 2 Kennungen vergleichen müssen. Die einzigen Lösungen sind 1: die Sprache so weit verstehen, dass man von Anfang an keinen so dummen Fehler macht (nicht schwer. Ich hatte diesen Fehler in den 12 Jahren, in denen ich in C programmiert habe, noch nie); 2: Verwenden Sie einen Compiler, der dies als Fehler kennzeichnet und von Ihnen verlangt, die Zuweisung in Klammern zu setzen. oder 3: einen Watchpoint auf DEFCON setzen und einen Debugger verwenden

    – Geschickt gehackt

    29. Oktober 2016 um 21:12 Uhr


Verkaufen Sie mich auf const Korrektheit
Chris Mayer

Es scheint, als ob ich jedes Mal, wenn ich etwas als konstant markiere, eine Fehlermeldung erhalte und irgendwo eine andere Funktion ändern muss, um auch konstant zu sein. Dies führt dann dazu, dass ich an anderer Stelle eine andere Funktion ändern muss. Ist das etwas, das mit der Erfahrung immer einfacher wird?

Erfahrungsgemäß ist dies ein totaler Mythos. Es passiert, wenn nicht konstant korrekter Code mit konstant korrektem Code zusammenhängt, sicher. Wenn Sie von Anfang an const-correct entwerfen, sollte dies NIE ein Problem sein. Wenn Sie etwas konstant machen und dann etwas anderes nicht kompiliert, sagt Ihnen der Compiler etwas extrem Wichtiges, und Sie sollten sich die Zeit nehmen, es zu beheben richtig.

  • Dies hat mir geholfen, so viele Fehler zu vermeiden, bei denen ich eine konstante Funktion hatte, die eine nicht konstante Funktion aufrufen wollte, weil ich vergessen hatte, dass sie darunter liegende Daten ändert.

    – Muhende Ente

    19. August 2013 um 20:11 Uhr

  • Nur sehr wenige Menschen beginnen immer mit sauberen Codebasen. Die meiste Codierung ist die Wartung von Legacy-Code, wobei der zitierte Kommentar ziemlich genau ist. Ich verwende const beim Schreiben neuer Blattfunktionen, aber ich frage mich, ob es sich lohnt, Dinge durch ein halbes Dutzend oder ein Dutzend Aufrufebenen von unbekanntem Code zu jagen.

    – Warren Tau

    26. März 2014 um 2:06 Uhr


  • Das ist meiner Erfahrung nach völlig falsch. Verschachtelte Punkttypen bereiten bei solchen Dingen die größten Kopfschmerzen, wenn Sie mehrere const-quantifiers in einem einzigen Typ haben können.

    – Noldorin

    23. Mai 2015 um 0:58 Uhr

  • “Wenn Sie von Anfang an const-correct entwerfen”, wie oft haben Sie dann tatsächlich den Luxus, const-correcture von Anfang an zu erzwingen?? Die meisten von uns müssen sich täglich mit zahlreichen APIs und Bibliotheken auseinandersetzen, wo dies nicht der Fall ist, und Sie können wenig dagegen tun. Also stimme ich dem OPs-Gefühl zu: “Es scheint, als würde ich jedes Mal, wenn ich etwas als konstant markiere, einen Fehler a bekommen” …

    – nyholku

    28. März 2019 um 14:42 Uhr

  • @WarrenDew Das ist ein transitives Argument; wenn die ursprünglichen Autoren verwendet hätten const richtig (also “von vorne”) dann gäbe es ja kein problem, und genau das ist der punkt!

    – Leichtigkeitsrennen im Orbit

    31. Mai 2019 um 14:23 Uhr

Wenn Sie const rigoros verwenden, werden Sie überrascht sein, wie wenige echte Variablen in den meisten Funktionen vorhanden sind. Oft nicht mehr als ein Schleifenzähler. Wenn Ihr Code diesen Punkt erreicht, bekommen Sie ein warmes Gefühl im Inneren … Validierung durch Kompilierung … das Reich der funktionalen Programmierung ist nah … Sie können es jetzt fast berühren …

Es ist nicht für Sie, wenn Sie den Code anfänglich schreiben. Es ist für jemand anderen (oder Sie ein paar Monate später), der sich die Methodendeklaration innerhalb der Klasse oder Schnittstelle ansieht, um zu sehen, was sie tut. Ein Objekt nicht zu modifizieren ist eine wichtige Information, die man daraus ziehen kann.

  • Das ist nur irgendwie wahr. Const wird auch als Schutz verwendet, um In-Variablen durch Schnittstellen usw. zu erzwingen.

    – Jordan Parmer

    25. September 2008 um 23:41 Uhr

  • Das ist es, aber Sie können dies durch disziplinierte Codierungspraktiken durchsetzen, und auf dem Poster heißt es. Der eigentliche Vorteil ergibt sich daraus, dass sich dies in der API widerspiegelt.

    – Antonio Haley

    25. September 2008 um 23:46 Uhr

  • Exakt. Es ist besser, “const int Value = 5 ;” zu haben. als “int ConstValue = 5 ;”. +1.

    – Paercebal

    11. Oktober 2008 um 20:48 Uhr

  • Der richtige Zeitpunkt, um const-correctness einzubauen, ist, wenn Sie die API anfänglich schreiben. Andernfalls bekommen Sie Probleme mit const-poisoning, wenn Sie es nachrüsten (weshalb das Hinzufügen zu altem Code eine ganz andere Sache um es in neuem Code zu tun).

    – Donal Fellows

    29. August 2010 um 16:23 Uhr

  • @DonalFellows das heißt nicht, später const einfügen. Es sagt, dass Sie erhalten Sie die Vorteile später, wenn Sie den Code mit bereits vorhandenem const lesen

    – Caleth

    2. April 2019 um 8:15 Uhr

1646938818 842 Verkaufen Sie mich auf const Korrektheit
John McG

const ist ein Versprechen, das Sie als Entwickler abgeben und bei dessen Durchsetzung die Hilfe des Compilers in Anspruch nehmen.

Meine Gründe für die Const-Korrektur:

  • Es teilt den Clients Ihrer Funktion mit, dass Sie die Variable oder das Objekt nicht ändern werden
  • Das Akzeptieren von Argumenten als const-Referenz gibt Ihnen die Effizienz der Referenzübergabe mit der Sicherheit der Wertübergabe.
  • Wenn Sie Ihre Schnittstellen als konstant korrekt schreiben, können Clients sie verwenden. Wenn Sie Ihre Schnittstelle so schreiben, dass sie nicht-const-Referenzen aufnimmt, müssen Clients, die const verwenden, constness wegwerfen, um mit Ihnen zu arbeiten. Dies ist besonders ärgerlich, wenn Ihre Schnittstelle nicht-konstante Zeichen* akzeptiert und Ihre Clients std::strings verwenden, da Sie von ihnen nur ein konstantes Zeichen* erhalten können.
  • Die Verwendung von const wird den Compiler dazu bringen, Sie ehrlich zu halten, damit Sie nicht versehentlich etwas ändern, das sich nicht ändern sollte.

  • Das ist nur irgendwie wahr. Const wird auch als Schutz verwendet, um In-Variablen durch Schnittstellen usw. zu erzwingen.

    – Jordan Parmer

    25. September 2008 um 23:41 Uhr

  • Das ist es, aber Sie können dies durch disziplinierte Codierungspraktiken durchsetzen, und auf dem Poster heißt es. Der eigentliche Vorteil ergibt sich daraus, dass sich dies in der API widerspiegelt.

    – Antonio Haley

    25. September 2008 um 23:46 Uhr

  • Exakt. Es ist besser, “const int Value = 5 ;” zu haben. als “int ConstValue = 5 ;”. +1.

    – Paercebal

    11. Oktober 2008 um 20:48 Uhr

  • Der richtige Zeitpunkt, um const-correctness einzubauen, ist, wenn Sie die API anfänglich schreiben. Andernfalls bekommen Sie Probleme mit const-poisoning, wenn Sie es nachrüsten (weshalb das Hinzufügen zu altem Code eine ganz andere Sache um es in neuem Code zu tun).

    – Donal Fellows

    29. August 2010 um 16:23 Uhr

  • @DonalFellows das heißt nicht, später const einfügen. Es sagt, dass Sie erhalten Sie die Vorteile später, wenn Sie den Code mit bereits vorhandenem const lesen

    – Caleth

    2. April 2019 um 8:15 Uhr

1646938818 707 Verkaufen Sie mich auf const Korrektheit
andreas buykx

C++ ohne const zu programmieren ist wie Fahren ohne angelegten Sicherheitsgurt.

Es ist mühsam, den Sicherheitsgurt jedes Mal anzulegen, wenn Sie ins Auto steigen, und an 364 von 365 Tagen werden Sie sicher ankommen.

Der einzige Unterschied besteht darin, dass Sie es sofort spüren, wenn Sie Probleme mit Ihrem Auto haben, während Sie bei der Programmierung ohne const möglicherweise zwei Wochen lang suchen müssen, was diesen Absturz verursacht hat, nur um herauszufinden, dass Sie versehentlich ein Funktionsargument vermasselt haben Sie haben aus Effizienzgründen eine nicht konstante Referenz übergeben.

988740cookie-checkVerkaufen Sie mich auf const Korrektheit

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy