-
Forum: Programmieren allgemein
Delphi
by Zacherl,
17. Apr 2018
Korrekt. Bestimmt ein Schreibfehler :P
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
16. Apr 2018
Triviale Typen wie Integer werden immer direkt in ein Register geschoben oder auf den Stack gepusht. Vollkommen egal, ob du const verwendest oder nicht. Dynamische Arrays verhalten sich eigentlich 1 zu 1 wie Strings (Ref-Count Mechanik, Copy on Write, etc). Statische Arrays (array of Integer) wie folgt:
Ohne const:
Unit2.pas.29: begin
005CE298 55 push ebp
005CE299 8BEC ...
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
16. Apr 2018
Puh, das sind alles Informationen, die ich im Laufe der Jahre aus verschiedenen Quellen und durch Beobachtung zusammengetragen habe. Also insbesondere zum const kann ich dir sagen, dass Records bis 4/8 Byte (je nach 32- bzw. 64-bit) direkt übergeben werden (da die Werte ja dann direkt in ein Register bzw. auf den Stack passen) und erst danach werden (meistens) Referenzen verwendet. Dazu steht im...
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
16. Apr 2018
Jap, aufpassen muss man hier aber schon. Also ganz egal welche Art der Übergabe man verwendet, ist es ja dann nicht.
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
16. Apr 2018
Hier muss man schon aufpassen. Im Falle eines nicht-const/var/out Strings wird keine direkte Referenz übergeben, sondern lokal ein neuer mutable String erzeugt. Ansonsten würde man ja die übergebene Instanz modifizieren können - was definitiv unerwünscht ist. Auch im Falle von Record stimmt es NICHT, dass immer Referenzen übergeben werden. Das hängt mitunter z.B. von der Record-Größe ab. Selbst...
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
16. Apr 2018
Jap schon klar :) Das ist aber mehr als ausreichend, weil die Optimierungen ja trotzdem schon dem Intermediate Layer durch LLVM ausgeführt werden sollten. Wenn die Übersetzung nach X86 dann nicht absolut versaut wird, sollten wir deutlich bessere Kompilate bekommen. Cool auf jeden Fall.
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
16. Apr 2018
Auch die Win32/64 Kompilate? Das wäre wunderbar. Ich bin sicher LLVM schafft solche Optimierungen auch ohne ungewollte Nebeneffekte umzusetzen.
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
16. Apr 2018
Damit wollte ich vor allem die Inkonsistenz aufzeigen.
Nee, das nicht. Strings werden in Delphi Heap-allocated.
Das ist ein wichtiger Punkt. Bin auch der Meinung, dass zumindest die "nicht initialisiert" Meldung trotzdem angezeigt oder die ganze Optimierung anders umgesetzt werden sollte.
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
16. Apr 2018
Selbst bei den class operator werden temporäre R-Values verwendet. Wenn man beispielsweise die Addition eines Record überläd, wird ein komplett neuer temporärer Record erstellt und als Ergebnis des Operators zurückgeliefert, welcher dann letztlich der L-Value zugewiesen wird (was meiner Meinung nach schon ziemlicher Schwachsinn ist, aber okay ...). Dadurch dass der String intern als var Parameter...
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
16. Apr 2018
Unintuitiv ist das Verhalten allerdings schon. Bei einer Funktion in Delphi erwarte ich grundsätzlich temporäre R-Values. Andere Sprachen - wie z.b. C++ - erlauben ja auch die Rückgabe von Referenzen, da ist das Verhalten aber einheitlich.
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
15. Apr 2018
var ist genau wie (meistens) const ein "pass by reference", also stimmt das schon mit der Vermeidung von unnötigen Kopieroperationen. Da ein Output Parameter ja aber gewünscht ist, macht const hier keinen Sinn :gruebel:
Nöö. var ist runtergebrochen auf den generierten Code exakt gleichwertig zu out (auch wenn out gegebenenfalls aus Gründen der Übersichtlichkeit zu bevorzugen ist).
...
-
Forum: Programmieren allgemein
Delphi
by Zacherl,
15. Apr 2018
Ziemlich wurscht. Wenn man einen Rückgabewert hat, sind Funktionen zu bevorzugen, da sie intuitiver sind und genau für diesen Zweck entwickelt wurden. In seltenen Fällen (bei Übergabe großer Strukturen bzw. Strings, etc.) kann ein var Parameter sinnvoll sein, um Kopieroperationen zu vermeiden. Muss man sich im Normalfall aber keine Gedanken drüber machen.
Auf Assembler-Ebene gibt es keine...