VirtualAlloc bzw. HeapAlloc



  • Hallo,

    bin gerade dabei eine eigene kleine malloc-Funktion zu basteln.
    Jetzt stehe ich vor der Frage: VirtualAlloc oder lieber HeapAlloc ?

    Dazu müsste ich wissen, wo genau die Unterschiede liegen. Ich glaube zu wissen, dass VirtualAlloc im Gegensatz zu HeapAlloc nicht genau n Bytes reserviert, sondern n+grenze_zur_nächsten_page.

    Bedeutet das, dass VirtualAlloc deswegen schneller ist und gibt es noch andere Vor/Nachteile?
    malloc benutzt ja so weit ich weiß VirtualAlloc...

    Danke und schöne Grüße!



  • Das sind zwei völlig verschiedene Dinge. VirtualAlloc() gibt dir ganze Pages. Das ist sozusagen die Low-Level Variante. Wie du dann den Speicher auf diesen Pages managest, ist deine Sache.
    Windows bietet dir aber schon eine fertige Heap Implementierung, die du über HeapAlloc() nutzen kannst.



  • Hm okay, also ist HeapAlloc auf jedenfall vorzuziehen (im Normalfall)?

    Hat VirtualAlloc noch irgendwelche Vorteile außer der wahrscheinlich höheren Geschwindigkeit und der "Low-Level-Möglichkeit" ?



  • Ja, soweit ich weiß benutzt das malloc von Visual C++ auch HeapAlloc.



  • malloc benutzt RtlAllocateHeap



  • __username schrieb:

    malloc benutzt RtlAllocateHeap

    Nein. Es benutzt "HeapAlloc" (siehe malloc.c, Zeile 54), was aber intern das gleiche ist wie "RtlAllocateHeap"...



  • OllyDbg sagt RtlHeapAlloc, aber ist ja egal.
    Aber gibts da jetzt noch Vorteile, die für VirtualAlloc sprechen, außer, dass es seine Ex-Version gibt?



  • Mich würde noch intressieren was der Unterschied zwischen malloc() und HeapAlloc() ist?


  • Mod

    Eigentlich bei neueren VC Versionen keiner mehr.

    Da gibt es nur einen entscheidenden Unterschied in der Debug-Version.



  • Martin Richter schrieb:

    Eigentlich bei neueren VC Versionen keiner mehr.

    Da gibt es nur einen entscheidenden Unterschied in der Debug-Version.

    Und was für einen?



  • hallo-ihr schrieb:

    Mich würde noch intressieren was der Unterschied zwischen malloc() und HeapAlloc() ist?

    Es gibt keinen. malloc allokiert (in der Debug-Version) nur noch etwas mehr um noch einige Verwaltungs-Infos abzulegen...

    Aber wie gesagt: malloc ruft intern HeapAlloc auf.

    Schau Dir doch einfach den Source der CRT an...



  • Dann wird HeapAlloc wohl die bessere Wahl für mich sein.
    Aber eine Frage habe ich noch:
    Wenn ich V-Alloc benutze, bekomme ich ja etwas mehr Speicher reserviert als ich wollte, da ganze Seiten reserviert werden.
    Heißt das dann, dass HeapAlloc keine ganzen Seiten reserviert? Oder wird der "Rest" der Seite einfach ignoriert?



  • Gängige Heap-Implementierungen allokieren Seiten vom Betriebssystem und geben Teile davon weiter an die Anwendung. Wenn also eine Anforderung weniger als eine Seite verbraucht, wird bei der nächsten Anforderung eben der Rest der Seite zugewiesen. Das genau ist u.a. der Job einer Heap-Implementierung.

    Wenn Du also wirklich eine eigene Heap-Implementierung schreiben möchtest, nimm VirtualAlloc und teile die Seiten dann in kleinere Häppchen ein, die Deine Allokationsfunktion zurückgibt.



  • Aber was wäre denn, wenn HeapAlloc Speicher reserviert und einen Teil zurückgibt. Dann hat HeapAlloc für den nächsten Aufruf noch "ein wenig" Speicher frei. Aber wenn zwischenzeitlich z.B. per VirtualAlloc Speicher reserviert wird, entsteht doch eine Lücke.
    Ungefähr so stelle ich mir das vor:

    [|Reservierter Speicher| |Lücke bis zur nächsten Page| |VirtualAlloc Speicher| |Reservierter Speicher| |Lücke bis zur nächsten Page| |...]

    Dann würde ja der Speicher nach und nach ziemlich fragmentiert sein, oder?
    Hoffe meine Frage ist verständlich 🙄



  • Was wäre wenn Du Dir die Doku dazu durchliest?
    Andernfalls kann man auch ein lustiges Ratespiel draus machen.
    Eine Frage wäre, wieviel Speicherlöcher kann man mit VirtualAlloc bauen, wenn der Luftdruck unter 820 hPa fällt.

    Man baut entweder mit HeapAlloc und/oder VirtualAlloc. Nutzt man beides zusammen, gibts für jede Funktion einen unterschiedlichen Speicherbereich. Versucht man eine auf den Speicherbereich allokiert durch die andere anzuwenden siehe RTFM.
    Man gibt den Speicher frei mit VirtualFree oder HeapFree.
    Möchte man den allokierten Speicher vergrößern, so gibt es für die Heap-Funktionalität ein HeapReAlloc. Diese fluppt aber nur für Heap-Du-weißt-schon. Wie es bei VirtuallAlloc läuft verrät Dir die MSDN.
    Wie die sich verhält und was die mit den Löchern anstellt, siehe Dokumentation.


  • Mod

    RTFM (Read the fine MSDN).

    VirtualAlloc ist tiefer gelagert als HeapAlloc. Intern benutzt HeapAlloc VirtualAlloc...



  • RTFM (Read the fine MSDN)
    Klasse den kannte ich noch nicht 😃



  • fine MSDN hab ich gelesen 😉

    Also kann man abschließend sagen: HeapAlloc = VirtualAlloc + Managment ?

    Das man entweder die eine Funktion oder die andere benutzt ist mir klar, die Sache ist nur, dass ich eine DLL schreibe. Was ich aufrufe und was der DLL-User aufruft, sind aber möglicherweise zwei verschiedene Dinge...



  • __username schrieb:

    Was ich aufrufe und was der DLL-User aufruft, sind aber möglicherweise zwei verschiedene Dinge...

    Und inwiefern ist was der User aufruft für dich relevant?



  • Man baut entweder mit HeapAlloc und/oder VirtualAlloc. Nutzt man beides zusammen, gibts für jede Funktion einen unterschiedlichen Speicherbereich

    War nur darauf bezogen


Anmelden zum Antworten