AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Suboptimale Klassenoperatoren?

Ein Thema von himitsu · begonnen am 1. Mär 2015 · letzter Beitrag vom 2. Mär 2015
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

Suboptimale Klassenoperatoren?

  Alt 1. Mär 2015, 16:11
Delphi-Version: 2006
Weiß eigentlich jemand, warum man einige Operatoren echt bescheuert implementiert hat?

Inc, Dec, Include und Exclude müssten ja eigentlich als Var-Parameter existieren und nicht mit einem nutzlosen Result-Parameter?
Im Ergebnis verliert man dadurch doch gerade den Vorteil dieser Funktionen Prozeduren, welche eigentlich direkt die Variable verändern und nicht erst eine Kopie erstellen und damit das Original überschreiben.




Das jetzt noch zu ändern wäre wohl zu spät.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: Suboptimale Klassenoperatoren?

  Alt 1. Mär 2015, 17:47
Inc, Dec, Include und Exclude müssten ja eigentlich als Var-Parameter existieren und nicht mit einem nutzlosen Result-Parameter?
Sorry, aber ich weiß im Moment nicht, was du meinst. Reden wir hier von Record-Operatoren?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Suboptimale Klassenoperatoren?

  Alt 1. Mär 2015, 18:05
Inc, Dec, Include und Exclude müssten ja eigentlich als Var-Parameter existieren und nicht mit einem nutzlosen Result-Parameter?
Im Ergebnis verliert man dadurch doch gerade den Vorteil dieser Funktionen Prozeduren, welche eigentlich direkt die Variable verändern und nicht erst eine Kopie erstellen und damit das Original überschreiben.
Widersprichst du dir da nicht selbst?

wenn sie var-Parameter hätten, dann würde ja das Original überschrieben werden
als Function mit Rückgabewert bleibt ja das Original unberührt
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Suboptimale Klassenoperatoren?

  Alt 1. Mär 2015, 18:15
Wisst ihr (ausgenommen Uwe, der weiß es) eigentlich, was das mit dem class operator auf sich hat?

Delphi-Quellcode:
type
  TFoo = record
    Value: Integer;
    class operator Inc( a: TFoo ): TFoo;
  end;

{ TFoo }

class operator TFoo.Inc( a: TFoo ): TFoo;
begin
  Result.Value := a.Value + 1;
end;

procedure Test;
var
  LFoo : TFoo;
begin
  LFoo.Value := 1;
  Inc( LFoo );
end;
Preisfrage: Welchen Wert hat jetzt LFoo.Value ?
  1. 1
  2. 2
Ich würde das mal ausprobieren und dann einfach nur wundern. Lösung: B
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#5

AW: Suboptimale Klassenoperatoren?

  Alt 1. Mär 2015, 18:27
Wisst ihr (ausgenommen Uwe, der weiß es) eigentlich, was das mit dem class operator auf sich hat?
Ich weiß es auch. Und ich glaube, himitsu will darauf hinaus, dass es einfach unsinnig ist und der Compiler suboptimalen Code produziert.

Sei i: Integer, dann produziert "Inc(i)" Code, der den Inhalt von i an Ort und Stelle ("In-Place") erhöht.
In Rufos Beispiel produziert "Inc( LFoo )" dagegen Code, der TFoo.Inc(LFoo) aufruft, was eine temporäre Kopie von LFoo erstellt, die erhöht, nur um das Ergebnis dann gleich wieder LFoo zuzuweisen. Also praktisch: "LFooTemp := LFoo.Inc; LFoo := LFooTemp;" Dieser zusätzliche Schritt mit der Kopie erscheint unnötig und kann mit größeren Records Leistung verschwenden.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Suboptimale Klassenoperatoren?

  Alt 1. Mär 2015, 18:35
Ja und? Ein Record kann ja nun auch etwas umfangreicher als ein Integer sein und auch das Inc kann dann durchaus etwas anspruchsvoller sein als einfach nur einen Wert hochzuzählen.

Und da man eben nicht weiß (und es eben komplexer sein kann) ist es genau so umgesetzt worden.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#7

AW: Suboptimale Klassenoperatoren?

  Alt 1. Mär 2015, 18:44
Der springende Punkt ist, dass Inc und Dec für Standardtypen In-Place-Operationen sind und deshalb auch für Class Operators sein sollten.
Das wäre konsistenter und schneller. Wenn ich "komplexeres" Verhalten und eine Kopie möchte, kann ich auch einfach TFoo + 1 benutzen.
Wenn der Delphi-Compiler besser optimieren würde, dann wäre das kein Ding. Leider tut er es aber nicht...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Suboptimale Klassenoperatoren?

  Alt 1. Mär 2015, 18:50
Da die es nicht wussten, sollte es "normal" implementiert sein, also als VAR.

Wenn der Typ das nicht unterstützt, dann kann man es "intern" immernoch anders umsetzen.
Delphi-Quellcode:
class operator TMyRecord.Inc(var Value: TMyRecord);
var
  Temp: TMyRecord;
begin
  Temp := Value;
  ...
  Value := ...;
end;
Genau genommen fehlt sogar noch die Inc-Version mit zwei Parametern.
Inc(i, 123);

Reden wir hier von Record-Operatoren?
Ja und Nein.

Aus technischen Gründen ist es "anfangs" nur für Records implementiert wurden.
Warum man vergessen hat das für Interfaces zu bauen, weiß ich nicht. (das ginge schon immer)
Dankt ARC wäre es, inzwischen seit XE4, auch möglich das bei Objekten (Klassen) zu benutzen.

Und grade bei Objekten wird der das immer mehr, wenn nun auch noch Objektinstanzen erstellt und freigegeben werden müssen, statt nur einem billigem Record.
Ein Vorteil bei den Objekten ist, daß man dort tricksen kann und bei diesen Operatoren einfach die selbe Objektreferenz zurückgibt. (wenn man blind hofft, daß Emba diese Funktionen nicht doch mal für zwei Objekte benutzt)
$2B or not $2B

Geändert von himitsu ( 1. Mär 2015 um 19:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Suboptimale Klassenoperatoren?

  Alt 2. Mär 2015, 08:13
So kann man sich täuschen.

Ich dachte immer, dass ein
Delphi-Quellcode:
var
  Value: Integer;

Inc( Value );
intern so funktioniert, dass der Wert von Value ausgelesen, dann um 1 erhöht (ergibt einen neuen Wert, der auch Speicher belegt) und dann zurückgeschrieben wird.
Delphi-Quellcode:
procedure Inc( var AValue : Integer );
begin
  AValue := AValue + 1;
end;
oder noch etwas anders geschrieben
Delphi-Quellcode:
function IntegerInc( AValue : Integer ): Integer;
begin
  Result := AValue + 1;
end;

procedure Inc( var AValue : Integer );
begin
  AValue := IntegerInc( AValue );
end;
Also ganz genau wie das hier bei den Records passiert, da ein Record eben auch nur einen komplexerer Wert darstellt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 2. Mär 2015 um 08:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Suboptimale Klassenoperatoren?

  Alt 2. Mär 2015, 08:59
Das Ding ist, dass der Compiler bei nem Integer schlau genug ist, auch einfach nen inc daraus zu generieren ohne temporäre Resultvariable. Das ist bei operator overloading leider nicht der Fall - Stichwort Return value optimization (beziehungsweise das Fehlen eben dieser).
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz