AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Generic <T>, injected DLL, was aus Speicher auslesen?
Thema durchsuchen
Ansicht
Themen-Optionen

Generic <T>, injected DLL, was aus Speicher auslesen?

Ein Thema von MrLolli · begonnen am 25. Jan 2014 · letzter Beitrag vom 25. Jan 2014
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

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

AW: Generic <T>, injected DLL, was aus Speicher auslesen?

  Alt 25. Jan 2014, 18:52
Steckt man das obige Beispiel so in eine Klasse sollte es ja keine Probleme geben.
Joar.

Ach ja, ich hatte meinen letzten Beitrag in der Zwischenzeit nochmal bearbeitet ... war wohl nur etwas langsam dabei.


Und zum Array:
Delphi-Quellcode:
type
  // diese Array-Typen gibt es manchmal auch vordefiniert (z.B. PByte für Array[] of Byte)
  // manche Pointer-Typen besitzen auch schon eine integrierte Pointer-Arithmetik, wo man sich das Array sparen kann (z.B. PAnsiChar)
  TIntegerArray: array[0..0] of Integer;
  PIntegerArray: ^TIntegerArray;

var
  MyArr: PIntegerArray;

MyArr := Pointer($12345678);
for i := 0 to 10 of
  ShowMessage(IntToStr( MyArr[i] ));
Das entspricht quasi einem
Delphi-Quellcode:
var
  MyPnt: NativeUInt;

MyPnt := $12345678;
for i := 0 to 10 of
  ShowMessage(IntToStr( PInteger(MyPnt + i * SizeOf(Integer))^ )); // wobei den Offset Delphi auch automatisch berechnen kann => siehe oben
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Jan 2014 um 18:56 Uhr)
  Mit Zitat antworten Zitat
MrLolli

Registriert seit: 5. Aug 2008
8 Beiträge
 
#2

AW: Generic <T>, injected DLL, was aus Speicher auslesen?

  Alt 25. Jan 2014, 18:57
Da sehe ich nun das Problem das auch int64 Werte vorhanden sind, daher gefiel mir der Generic eigentlich am Besten.
Wären alles 4 Byte Werte, wäre es ja halb so wild und man könnte schnell 'umcasten'.

Vorher habe ich mir den Pointer zum Wert zurückgeben lassen und konnte dann einfach mit PInteger(Pointer)^ den Wert auslesen, optisch finde ich den Generic aber besser.
Nur fraglich ob es von der Leistung her auch so toll ist, aber soll mir in einem nur-für-mich Projekt eigentlich egal sein
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Generic <T>, injected DLL, was aus Speicher auslesen?

  Alt 25. Jan 2014, 19:12
Wieso sollte Int64 ein Problem sein?
In deinem Generic machst du doch genau das Selbe, nur halt etwas umständlicher weggekapselt.

Du castest ja nicht den "Inhalt" des Pointers, welcher in Win32 zufällig 4 Byte ist,
sondern das, worauf der Pointer zeigt und da ist die Größe egal.

Ein untypisierter Pointer hat quasi eine Größe von 0 Byte und beim Cast auf andere Typen wird dort keine Größenprüfung vom Compier vorgenommen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
MrLolli

Registriert seit: 5. Aug 2008
8 Beiträge
 
#4

AW: Generic <T>, injected DLL, was aus Speicher auslesen?

  Alt 25. Jan 2014, 19:20
Ah verstehe

Finde dennoch es sieht mit Generics ein wenig hübscher und übersichtlicher aus, da ich von sehr vielen Stellen aus darauf zugreife. Denke einen allzu großen Performance-Verlust sollte es da nicht geben, oder? Zumindest sieht der generierte asm Code dazu ganz sauber aus.

Wobei es mir eh nicht um jede Nanosekunde geht. ^^
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Generic <T>, injected DLL, was aus Speicher auslesen?

  Alt 25. Jan 2014, 21:03
Wenn du die Funktion als inline deklarierst und der Kompiler in der Lage ist, den Code auch direkt einzubinden, dann könnte es sein, daß der Compiler Vieles von der Funktion wegopimiert.

Delphi-Quellcode:
type
  TMyClass<T> = class
  public type
    PT = ^T; // muß natürlich public sein, damit es an der aufrufenden Stelle verfügbar ist
  public
    class function GetMem<T>(Offset: NativeUInt): T; static; inline;
  end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Jan 2014 um 21:06 Uhr)
  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 22:21 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