Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Getter und Setter eines Records inlinen? (https://www.delphipraxis.net/176159-getter-und-setter-eines-records-inlinen.html)

Zacherl 15. Aug 2013 14:11

Delphi-Version: XE2

Getter und Setter eines Records inlinen?
 
Hallo zusammen,

ich habe einen kleinen Record, welcher in sehr kompakter Form Daten speichert. Diese Daten werden mit simplen Bit Operationen aus verschiedenen Feldern gelesen und geschrieben. Für den simplen Zugriff habe ich jeweils Properties und entsprechende Getter / Setter erstellt.

Jetzt habe ich mich gefragt, ob es sinnvoll ist diese Methoden mit der inline Direktive zu versehen?

Weiß jemand, wie das Standardverhalten von Delphi in Bezug auf Inlining von Gettern und Settern ist?

Viele Grüße
Zacherl

jaenicke 15. Aug 2013 15:23

AW: Getter und Setter eines Records inlinen?
 
Das ist auf jeden Fall sinnvoll, insbesondere wenn diese Properties häufig angesprochen werden.
Standardmäßig wird nichts inlined wo das nicht dransteht.

Namenloser 15. Aug 2013 17:33

AW: Getter und Setter eines Records inlinen?
 
Ich habe das auch so gemacht, als ich vor ein paar Tagen (in Freepascal) balancierte Bäume implementiert habe. Ist denke ich definitiv sinnvoll. Interessant wäre nur, ob der Compiler auch die automatisch aufgerufenen Getter und Setter bei Properties inlinen kann, denn schließlich müssen die ja auch für die RTTI zugänglich sein. Das müsste man mal ausprobieren... In meinem Fall gab es aber praktisch eh nur lesende Zugriffe, deshalb habe ich mir die Mühe nicht gemacht, das zu prüfen, sondern mir die Properties gespart und einfach das „Get“ im Funktionsnamen weggelassen und dann die Funktion so benutzt wie eine Property.

Zacherl 15. Aug 2013 18:54

AW: Getter und Setter eines Records inlinen?
 
Zitat:

Zitat von NamenLozer (Beitrag 1225003)
Interessant wäre nur, ob der Compiler auch die automatisch aufgerufenen Getter und Setter bei Properties inlinen kann, denn schließlich müssen die ja auch für die RTTI zugänglich sein. Das müsste man mal ausprobieren... In meinem Fall gab es aber praktisch eh nur lesende Zugriffe, deshalb habe ich mir die Mühe nicht gemacht, das zu prüfen, sondern mir die Properties gespart und einfach das „Get“ im Funktionsnamen weggelassen und dann die Funktion so benutzt wie eine Property.

Habs mir grade mal in der Assembler-Ansicht angeschaut und wie es scheint werden die Properties korrekt inlined. Ich habe diese allerdings auch nicht als published, sondern als public deklariert (published funktioniert für Records auch überhaupt nicht, wie ich grade feststellen musste :-D). Soweit ich weiß werden doch nur published Properties per RTTI zugänglich gemacht oder nicht?

Namenloser 15. Aug 2013 19:59

AW: Getter und Setter eines Records inlinen?
 
Zitat:

Zitat von Zacherl (Beitrag 1225009)
Soweit ich weiß werden doch nur published Properties per RTTI zugänglich gemacht oder nicht?

Schon (zumindest früher, siehe unten), andererseits wäre es ja auch bei puplished Properties theoretisch kein Problem, dann müsste der Code halt zusätzlich noch mal extra im Programm stehen. Ich bin mir bei solchen Sachen nur nie sicher, wie schlau der Compiler wirklich ist...

Allerdings gibt es ja unter neueren Delphis (die ich nicht habe) auch noch diese erweiterte RTTI, ich weiß nicht ob die Regel mit published dort noch gilt.

Zacherl 15. Aug 2013 20:12

AW: Getter und Setter eines Records inlinen?
 
Zitat:

Zitat von NamenLozer (Beitrag 1225028)
Zitat:

Zitat von Zacherl (Beitrag 1225009)
Soweit ich weiß werden doch nur published Properties per RTTI zugänglich gemacht oder nicht?

Schon (zumindest früher, siehe unten), andererseits wäre es ja auch bei puplished Properties theoretisch kein Problem, dann müsste der Code halt zusätzlich noch mal extra im Programm stehen.

Ja genau, das dachte ich mir auch. Konnte es beim Record leider auf die Schnelle nicht testen, da der überhaupt keine published Methoden erlaubt. Müsste man nochmal mit einer "normalen" Klasse prüfen.

Zitat:

Zitat von NamenLozer (Beitrag 1225028)
Allerdings gibt es ja unter neueren Delphis (die ich nicht habe) auch noch diese erweiterte RTTI, ich weiß nicht ob die Regel mit published dort noch gilt.

Hat zumindest mal den Anschein. Habe an den RTTI Einstellungen jetzt nichts bewusst geändert.

Der schöne Günther 15. Aug 2013 22:55

AW: Getter und Setter eines Records inlinen?
 
Published ist der Extended RTTI ziemlich egal. Die kommt sogar an private Felder und Properties dran :-D

Vor ein paar Monaten habe ich mich das auch laut gefragt (siehe: Unterschied Sichtbarkeitsmodifikator 'Published' zu 'Public' und heraus kam, dass published praktisch nur für die Deklaration von VCL-Komponenten für das Speichern und Einlesen der Formulare notwendig ist.

Stevie 16. Aug 2013 07:57

AW: Getter und Setter eines Records inlinen?
 
Records unterstützen eh nur die Sichtbarkeiten private und public.

Und die Enhanced RTTI ist auch in XE4 bisher unfähig Properties von Record types auszulesen (bzw die RTTI wird vermutlich gar nicht generiert - siehe QC 78110).

jaenicke 16. Aug 2013 08:42

AW: Getter und Setter eines Records inlinen?
 
Sie wird für Felder, Attribute und Methoden von Records ausgelesen, aber nicht für Properties. Das sieht man auch sofort im Quelltext des Typs TRttiRecordType:
Delphi-Quellcode:
    function GetDeclaredFields: TArray<TRttiField>; override;
    function GetDeclaredMethods: TArray<TRttiMethod>; override;
    function GetAttributes: TArray<TCustomAttribute>; override;
Nicht überschrieben ist hingegen:
Delphi-Quellcode:
function TRttiType.GetDeclaredProperties: TArray<TRttiProperty>;
begin
  Exit(nil);
end;
Genauso wenig GetProperties.

Wenn ich das aber in der generierten .exe richtig lese, sind die Informationen dort durchaus vorhanden... es gibt nur offenbar in der RTTI keine Möglichkeit sie auszulesen.

Stevie 16. Aug 2013 08:51

AW: Getter und Setter eines Records inlinen?
 
Zitat:

Zitat von jaenicke (Beitrag 1225086)
Wenn ich das aber in der generierten .exe richtig lese, sind die Informationen dort durchaus vorhanden... es gibt nur offenbar in der RTTI keine Möglichkeit sie auszulesen.

Hast du noch weitere Infos bzgl des Formats, so dass man das nachrüsten kann?
VMT Hack für TRttiRecord Type um die GetDeclaredProperties Methode zu überschreiben ist ja kein Problem :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 Uhr.
Seite 1 von 2  1 2      

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