Dann melde bitte einen Bug gegen die Dokumentation.af0815 hat geschrieben: Do 17. Nov 2022, 08:01Das wäre eine Information die in die Referenz https://www.freepascal.org/docs-html/cu ... ogsu4.html IMHO hineingehören würde. Weil damit ist es klar und definiert, wie der Compiler sich verhält.PascalDragon hat geschrieben: Do 17. Nov 2022, 07:51 Ist Short-Circuiting aktiv, so ändert der Compiler die Reihenfolge nicht. Ist es nicht aktiv, macht der Compiler da in der Tat Optimierungen, wenn es sich anbietet.
Wir werden kein andAlso oder was auch immer einführen. Das einzige was wir einführen werden sind die besagten and_then und or_then, da die für ISO Extended Pascal Kompatibilität benötigt werden. Ansonsten werden wir da an nichts rütteln, auch nicht an dem Standardwert von $B (außer, wie ich gerade sehe, für die ISO Pascal and ISO Extended Pascal Modi, da dort der Standard die volle Auswertung sein sollte), da wir nicht einfach so mit neuen Schlüsselwörtern um uns schmeißen, nur weil irgendjemand es nicht passt, wie sich die Sprache und Implementierung entwickelt hat.MitjaStachowiak hat geschrieben: Do 17. Nov 2022, 13:42Da aktuell ja das normale and standardgemäß genau das tut, fände ich m.fuchs Vorschlag besser, das so zu lassen und den no-short-circuiting-Fall mit andAlso sowie orAlso anzubieten, statt mit {$push}{$B-}[...]{$pop}.Wir werden wahrscheinlich irgendwann mal Unterstützung für and_then und or_then aus ISO Extended Pascal einbauen.
So Sachen, wiesind schon so geläufig, dass man das Verhalten des regulären and nicht mehr ändern kann.Code: Alles auswählen
if (obj <> nil) and (obj.ready) then ... if (length(arr) > 0) and (arr[0] = x) then ...
Sobald im Getter ein Schreibzugriff passiert ist das nicht mehr - um den C++ Ausdruck zu nutzen - „const”. Aber ich spiele selbst durchaus auch mit dem Gedanken den Compiler versuchen zu lassen Funktionen, die wirklich keinen Schreibzugriff nach außen durchführen entsprechend (intern) zu markieren, so dass der Compiler da besser optimieren kann.MitjaStachowiak hat geschrieben: Do 17. Nov 2022, 14:56 Wie wäre es bei Methoden, Funktionen oder Properties mit einer Art unaltering-Direktive?
Ich bin nach etwas Nachdenken zu dem Schluss gekommen, dass FPC bei mehrfachen Peroperty-Zugriffen in einem Ausdruck nicht erkennen kann, ob man die durch Optimierungen zusammenfassen kann. Es kann ja z.B. sein, das ein Property eine Art Caching durchführt, sodass im Getter schon ein Schreibzugriff passiert. Nur dass es hier trotzdem egal ist, wie oft das property abgefragt wird. Der Compiler könnte den Zugriff also in einem Register puffern...
A propos Optimierung: wenn ein if-Ausdruck keine Funktionsaufrufe und Seiteneffekte enthält und die Bedingungen nicht zu komplex sind, schaltet der Compiler selbst die volle Auswertung für diesen Ausdruck ein, um ihn besser optimieren zu können (im Idealfall geht das dann nämlich ohne Sprünge
