![]() |
unterschiedliche Möglichkeiten, Speicher anzufordern
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? |
Re: unterschiedliche Möglichkeiten, Speicher anzufordern
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. |
Re: unterschiedliche Möglichkeiten, Speicher anzufordern
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. |
Re: unterschiedliche Möglichkeiten, Speicher anzufordern
SysGetMem und AllocMem für Heap-Speicher, wobei ersteres wohl am MM vorbei geht?
|
Re: unterschiedliche Möglichkeiten, Speicher anzufordern
Zitat:
|
Re: unterschiedliche Möglichkeiten, Speicher anzufordern
Delphi-Quellcode:
Bis auf VirtuallAlloc(Ex) gehen alle hier bisher hier genannten Funktionen über den Speicher-Manager,
function _New(size: Longint; typeInfo: Pointer): Pointer;
{$IFDEF PUREPASCAL} begin GetMem(Result, size); if Result <> nil then _Initialize(Result, typeInfo); end; {$ELSE} 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, ... |
Re: unterschiedliche Möglichkeiten, Speicher anzufordern
Zitat:
|
Re: unterschiedliche Möglichkeiten, Speicher anzufordern
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 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