![]() |
Lazarus - Inline über mehrere Klassen
Hi, ich wollte schon immer mal nen Performancevergleich Delphi <-> Lazarus machen und jetzt wo Lazarus 1.~ raus ist hab ich mich mal hingesetzt und ein größeres Projekt portiert.
Iwann hats dann auch endlich kompiliert ... ich die inline direktive angeschaltet ... bäm fpc heult rum ... Alles umsonst? Oder kennt jemand einen Trick wie Lazarus das frisst?
Delphi-Quellcode:
program inlinetest;
{$IFDEF FPC}{$MODE DELPHI}{$ENDIF} type TClassA = class private FTmp: Integer; public function IsOne: Boolean; inline; procedure SetToZero; end; TClassB = class(TClassA) public function IsOne: Boolean; inline; end; { TClassA } function TClassA.IsOne: Boolean; begin Result := FTmp = 1; end; procedure TClassA.SetToZero; begin FTmp := 0; end; { TClassB } function TClassB.IsOne: Boolean; begin result := inherited IsOne; end; var abcde: TClassB; begin abcde := TClassB.Create; if abcde.IsOne then // in Lazarus Kompilerfehler: inlinetest.dpr(47,11) Error: Illegal expression abcde.SetToZero; abcde.Free; end. |
AW: Lazarus - Inline über mehrere Klassen
Warum das dort (wieder einmal, das Problem kenne ich bei Lazarus) nicht geht, weiß ich nicht, aber ganz allgemein als Hinweis:
Die Verwendung von inline in FPC kann den Code auch verlangsamen statt beschleunigen, je nachdem was im Code passiert. ;-) |
AW: Lazarus - Inline über mehrere Klassen
Wenn man mal diese Funktion anschaut:
Delphi-Quellcode:
Dann müsste der Compiler 2-fach inlinen.
function TClassB.IsOne: Boolean;
begin result := inherited IsOne; end; Das dürfte doch etwas zuviel verlangt sein obwohl es natürlich theoretisch denkbar wäre, dass ein Compiler das auflösen kann. |
AW: Lazarus - Inline über mehrere Klassen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Anhang 38062 Wie du siehst ist das für Delphi kein Problem. ;-) |
AW: Lazarus - Inline über mehrere Klassen
Zitat:
Die richtigen Lazarusjünger werden wohl nicht so oft Delphi-kompatibel arbeiten, womit dort dann vermutlich mehr ginge. |
AW: Lazarus - Inline über mehrere Klassen
Zitat:
Nein, im Ernst: das war ein Bug in 2.6.0 und älter, der in 2.7.1 gefixt wurde. Trotzdem wird nur der "inherited IsOne" Aufruf geinlined, nicht jedoch das "if abcde.IsOne" (ob das beabsichtigt ist oder nicht kann ich grade jedoch nicht sagen). Auch weiß ich grade nicht ob der Fix in 2.6.1 gemergt wurde und damit Teil von 2.6.2 wird... Gruß, Sven |
AW: Lazarus - Inline über mehrere Klassen
@JamesTKirk: :thumb:
Jetzt kompiliert alles, zwar langsamer und mit myriaden inline-hints, aber vllt setz ich mich nochmal dran und copypaste mal bissl :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz