eine Referenz, damit Sie polymorph auf die Ausnahme zugreifen können
eine Konstante, um die Leistung zu steigern, und teilen Sie dem Compiler mit, dass Sie das Objekt nicht ändern werden
Letzteres nicht So viel wichtig wie ersteres, aber der einzige wirkliche Grund, const zu löschen, wäre zu signalisieren, dass Sie Änderungen an der Ausnahme vornehmen möchten (normalerweise nur nützlich, wenn Sie sie mit zusätzlichem Kontext auf einer höheren Ebene erneut werfen möchten).
„Sagen Sie dem Compiler, dass Sie das Objekt nicht ändern werden“ – ich nehme an, das könnte nützlich sein, wenn Sie das Objekt als Parameter an einen Funktionsaufruf übergeben.
– Craig McQueen
27. November 13 um 2:52 Uhr
Was meinst du mit “polymorph auf die Ausnahme zugreifen”?
– Mango
11. September 14 um 16:04 Uhr
@mango bedeutet vermutlich, eine virtuelle Funktion aufrufen zu können (wie z std::exception ‘S what() Funktion). Wenn Sie nach Wert fangen, können Sie diese Funktion nicht aufrufen und die ursprünglichen Ausnahmedetails abrufen.
– MM
20. Juli 15 um 21:35 Uhr
Ich habe mir die Assembly angesehen, die von Apple Clang 7 und gcc 5 (mit Optimierung O3) erstellt wurde, und ich sehe keinen Unterschied zwischen const ref und non-const ref Assembly. Ich denke also, es gibt keinen Unterschied in den Optimierungen für gcc und apple clang
– Wassilij Soschnikow
28. März 16 um 20:11 Uhr
Der Compiler kann leicht erkennen, welche Objekte Sie ändern und welche nicht (SSA und ständige Ausbreitung). Eine bessere Erklärung ist erforderlich (oder ist es ein Mythos?).
– rostig
20. Juli 17 um 20:33 Uhr
Es gibt im Grunde überhaupt keinen Grund.
Ausnahmeobjekte leben in ihrem eigenen Speicherbereich† Sie müssen sich also keine Gedanken über das Abfangen von Ausnahmen machen, die in temporären Ausdrücken erstellt wurden.
Alles, was Sie tun, ist zu versprechen, dass Sie das Ausnahmeobjekt nicht ändern werden, da Ausnahmeobjekte jedoch eine unveränderliche Schnittstelle haben sollten‡hier gibt es wirklich nichts Praktisches.
Es kann jedoch sein, dass Sie sich warm und gemütlich fühlen, wenn Sie es lesen – so ist es für mich!
† Sie haben ihren eigenen, speziellen Thread-lokalen Stack. ‡Haftungsausschluss: Boost.Exception unterbricht dies, um verrückte Sachen zu machen und Ausnahmedetails nach der Konstruktion hinzuzufügen. Aber das ist Hackerei!
Könnten Sie das bitte näher erläutern Exception objects live in their own memory space ? Hast du eine gute Lektüre dazu?
– Richard Dally
20. Januar 16 um 13:29 Uhr
@LeFlou: Ich könnte Sie auf den Standard verweisen, aber es wäre ein bisschen irreführend zu glauben, dass “eine gute Lektüre” …: P
– Leichtigkeitsrennen im Orbit
20. Januar 16 um 23:54 Uhr
Definitiv ja, es wäre interessant, mehr darüber aus der Standardsicht zu erfahren. ich lese Technischer Bericht zur C++-Leistunghaben Sie ein relevanteres Dokument ?
– Richard Dally
21. Januar 16 um 10:58 Uhr
@LeFlou: Nun, maßgeblicher als der Standard selbst wird es nicht….
– Leichtigkeitsrennen im Orbit
21. Januar 16 um 13:08 Uhr
@RichardDally prüfen C++-Primer 5, § 18.1.1 Ausnahmeobjekt. Es sagt Das Ausnahmeobjekt befindet sich in einem vom Compiler verwalteten Bereich, der garantiert für jeden aufgerufenen Catch zugänglich ist. Das Ausnahmeobjekt wird zerstört, nachdem die Ausnahme vollständig behandelt wurde.
– Rick
19. September 18 um 4:25 Uhr
Es teilt dem Compiler mit, dass Sie keine Funktion aufrufen werden, die die Ausnahme ändert, was zur Optimierung des Codes beitragen kann. Wahrscheinlich macht es keinen großen Unterschied, aber die Kosten dafür sind auch sehr gering.
wirst du die Ausnahme ändern? wenn nicht, kann es genauso gut const sein. Aus dem gleichen Grund SOLLTEN Sie const woanders verwenden (ich sage SOLLTE, weil es auf der Oberfläche nicht wirklich einen großen Unterschied macht, Compilern helfen könnte und auch Programmierern hilft, Ihren Code richtig zu verwenden und Dinge zu tun, die sie nicht tun sollten)
Ausnahmehandler, können plattformspezifisch sein und Ausnahmen an komischen Stellen platzieren, weil sie nicht erwarten, dass sie sich ändern?
Aus dem gleichen Grund verwenden Sie eine Konstante.
Und aus dem gleichen Grund, warum man Referenzen gegenüber Zeigern bevorzugt 🙂
– Dimitri C.
27. Januar 10 um 08:26 Uhr
Einfach und glatt, aber nicht wirklich eine Antwort.
– Allmächtig
28. Januar 10 um 15:47 Uhr
Und aus dem gleichen Grund, warum man Referenzen gegenüber Zeigern bevorzugt 🙂
– Dimitri C.
27. Januar 10 um 08:26 Uhr
Einfach und glatt, aber nicht wirklich eine Antwort.
– Allmächtig
28. Januar 10 um 15:47 Uhr
.
7580900cookie-checkWarum eine Ausnahme als Referenz auf Konstante abfangen?yes