Frage

Ich würde gerne wissen, welche Methode unter Windows C-Programmierung empfohlen:. Mit malloc oder Win32 HeapAlloc (? Vielleicht VirtualAlloc) Funktion

Ich habe die MSDN Speichermanagementfunktionen Artikel und die Artikel MSDN über malloc und HeapAlloc, aber sie sagen nicht, welche verwendet werden soll und in welchen Situationen.

War es hilfreich?

Lösung

mit malloc Halten Sie, wenn Sie einen zwingenden Grund haben, etwas anderes zu verwenden. Es wird unter in Bezug auf der OS Speicherzuweisung Primitive implementiert, aber es gibt keinen wirklichen Vorteil beim Tauchen nach unten auf diese Ebene selbst.

Einige API-Aufrufe Ich brauche einen Speicherblock von einem Windows-Heap zugewiesen glauben, aber Sie werden wissen, wenn Sie über sie kommen.

Oder wenn Sie etwas weiter fortgeschritten ist, wie die Verwendung Shared Memory tun wollen, oder müssen die Berechtigungen für die Speicherseiten steuern direkt, dann werden Sie in der Windows-API-Aufrufe wie VirtualAlloc aussehen müssen.

Andere Tipps

VirtualAlloc und Freunde können Sie ein wenig einer Kante geben, wenn Sie Haufen von Daten zu tun oder zu bearbeiten, wenn Sie trotzdem Ihre eigenen Speicher-Manager zu schaffen, um die Mühe zu gehen.

Ansonsten ist es einfacher, und natürlich mehr tragbar nur malloc () verwenden.

VirtualAlloc hat dieses nette Funktion namens MEM_RESET, die die Daten in einem Speicherblock in Abrede stellen, sondern hält es zugeordnet. Dies bedeutet, wenn es auf die Festplatte ausgelagert ist, wird Windows nicht auf Seite es zurück in das nächste Mal die Mühe Sie darauf zugreifen. Es ist schön, wenn man viele megs Daten haben, die plötzlich überflüssig werden können, aber Sie werden bald etwas anderes den Puffer zu füllen.

Es unterscheidet auch zwischen Adressraum reserviert und tatsächlich Speicher anfordert. Es gibt einige nette Sachen dort, wenn Sie einen guten Grund zu all die Mühe zu gehen.

Eine weitere Sache. Malloc () gewährleistet ist tragbar (zumindest jede ANSI-C-Implementierung) zu sein und eleganten

In einigen Situationen mit Funktionen wie HeapAlloc wird HeapFree Ihr Leben leichter machen. Ein Beispiel wäre: eine große Anwendung, wo Sie brauchen Speicher zuweisen in einem Modul (sagt in library1.dll) und frei, dass der Speicher in dem Hauptmodul (zB program.exe). Dies kann sicher durchgeführt werden, wenn Sie HeapAlloc, HeapResize und HeapFree Funktionen verwenden, kann aber nicht mit C-Laufzeitbibliothek getan werden (zB malloc, frei, die Größe).

ABER: Wenn Sie nicht einen guten Grund haben, sollten Sie Stick mit malloc / free / Größe ändern Funktionen. Auch, wenn Sie benötigen permisions des zugewiesenen Speichers ändern (zB: machen, wenn ausführbare Datei, usw.), können Sie Funktionen wie VirtualAlloc, Virtual verwenden sollten,

.

Sie können einen Wrapper machen und die Möglichkeit, lassen Sie die Details der Implementierung zu ändern. Sie könnten sogar beiden Optionen mit Ihrem Code vergleichen und dann entscheiden.

Im Gegensatz zu Rob, ich gehe in die andere Richtung ... Da ich gegen den WinAPI zu codieren gewählt habe, verwende ich die native Funktionen anstelle von C-Laufzeit diejenigen, die ohnehin um sie herum nur eine dünne Hülle sind.

Mit HeapAlloc können Sie separate Haufen für verschiedene Aufgaben / Subsysteme haben. Dies kann Dump-Analyse von großen Anwendungen vereinfachen.

Mit malloc können Sie nur einen Haufen, aber Sie einige Optimierungen Zuordnung erhalten die Autoren CRT kann oben auf OS HeapAlloc umgesetzt haben.

Abstieg zur VirtualAlloc hat man nicht viel kaufen, es sei denn, Sie benutzerdefinierte Heap-Manager (Ihren eigenen Satz von Heap * Funktionen) implementieren möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top