AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi unterschiedliche Möglichkeiten, Speicher anzufordern
Thema durchsuchen
Ansicht
Themen-Optionen

unterschiedliche Möglichkeiten, Speicher anzufordern

Ein Thema von mani64 · begonnen am 21. Apr 2009 · letzter Beitrag vom 23. Apr 2009
Antwort Antwort
mani64

Registriert seit: 8. Apr 2009
49 Beiträge
 
Delphi 5 Professional
 
#1

unterschiedliche Möglichkeiten, Speicher anzufordern

  Alt 21. Apr 2009, 22:34
Hallo,

es gibt ja bei Delphi unterschiedlihe Methoden, für einen Buffer/String/pChar Speicher anzufordern:

GetMem
StrAlloc
SetString

Welche Unterschiede bestehen zwischen den einzelnen Methoden und wann verwendet man welche am besten?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: unterschiedliche Möglichkeiten, Speicher anzufordern

  Alt 21. Apr 2009, 22:48
Um die Liste zu vervollständiogen:
- VirtuallAlloc
gibt es noch und irgendwie kannman noch Heap-Speicher anfordern.

Wäre schün, wenn hier mal jemand eine Liste erstellen könnte mit den Unterschieden. Denn das würde mich auch interessieren.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: unterschiedliche Möglichkeiten, Speicher anzufordern

  Alt 21. Apr 2009, 23:47
Um das mit dem Heap-Speicher noch zu vervollständigen. Das ging für ein Objekt doch mit new.

Edit:

Also VirtualAlloc(Ex) gibt Speicher in dem Bereich des (angegebenen) Prozesses frei.
GetMem liefert lediglich für irgendeinen Zeigertypen und deren angegebenen Länge Speicher, welcher mit FreeMem wieder freigegeben werden muss.
StrAlloc liefert einen Pointer auf die nullterminierte Stelle (PwideChar) eines Strings zurück und macht für die in Size -1 angegebene Länge Speicher frei.
SetString setzt die Lönge und den Inhalt des angegeben Strings.

Btw.: Nicht das ich manches von vornherein wusste. Ich hab einfach nur die Begriffe in die Delphi-Hilfe eingegeben und nun euch gesagt was darin und in der MSDN dazu stand. Wissen wo es steht Und demnächst mal selber die Hilfe dazu bedienen.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#4

Re: unterschiedliche Möglichkeiten, Speicher anzufordern

  Alt 22. Apr 2009, 00:07
SysGetMem und AllocMem für Heap-Speicher, wobei ersteres wohl am MM vorbei geht?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: unterschiedliche Möglichkeiten, Speicher anzufordern

  Alt 22. Apr 2009, 08:11
Zitat von quendolineDD:
Also VirtualAlloc(Ex) gibt Speicher in dem Bereich des (angegebenen) Prozesses frei.
Wenn dann wird Speicher reserviert und nicht freigegeben. Und ich meine der Speicher wird auf dem Heap reserviert. Mit new wird auch Speicher reserviert allerdings für einen Zeiger auf einen Record. Und ich meine der wird auch auf dem Heap reserviert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: unterschiedliche Möglichkeiten, Speicher anzufordern

  Alt 22. Apr 2009, 08:39
Delphi-Quellcode:
function _New(size: Longint; typeInfo: Pointer): Pointer;
{$IFDEF PUREPASCAL}
begin
  GetMem(Result, size);
  if Result <> nil then
    _Initialize(Result, typeInfo);
end;
{$ELSE}
Bis auf VirtuallAlloc(Ex) gehen alle hier bisher hier genannten Funktionen über den Speicher-Manager,
also meißt delphis MemoryManager oder ShareMem bzw. FastMM

um das Fortzusetzen:
am MM vorbei: LocalAlloc, GlobalAlloc, HeapAlloc, OLEGetMem, OLEAllocString, ...
über den MM: New, GetMem (SysGetMem), AllocMem, (SysAllocMem), GetMemory, ...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: unterschiedliche Möglichkeiten, Speicher anzufordern

  Alt 22. Apr 2009, 19:02
Zitat von Luckie:
Wenn dann wird Speicher reserviert und nicht freigegeben.
War eine unglückliche Formulierung meinerseits.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: unterschiedliche Möglichkeiten, Speicher anzufordern

  Alt 23. Apr 2009, 17:27
Grundregel: Nehmt NIEMALS VirtualAlloc, sofern ihr keinen eigenen Speichermanager implementieren wollt! VirtualAlloc kann Speicher nur seitenweise anfordern. Wenn man also 16 Byte braucht und VirtualAlloc bemüht, werden 4096 Byte angefordert - es werden also nur 1/256 des Speichers benutzt.
Bei Delphi ist es eigentlich gleich, welche Methode zum Allozieren des Speichers verwendet werden, da alles letztlich auf den Speichermanager zurückgeführt wird - also egal, ob New, GetMem, AllocMem, SetString, StrAlloc usw. Windows bietet drei weitere Methoden an: Die Heap-Funktionen, die Local-Funktionen und die Global-Funktionen. Local- und Global-Funktionen sind veraltet und sollten normalerweise nur verwendet werden, wenn in irgendeiner Dokumentation steht, dass sie verwendet werden sollen.
Insgesamt heißt das, dass für Speicheranforderung aus einem Pool nur der Delphi-Speichermanager und die Heap-Funktionen zur Verfügung stehen.

Zuguterletzt gibt es natürlich noch die Speicherfunktionen von COM, aber damit kenne ich mich wirklich nicht aus.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  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 12:19 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