Wan sollte welche Allokationsmethode verrwendet werden: CoTaskMemAlloc, GlobalAlloc, HeapAlloc, LocalAlloc, malloc, new
-
ich habe das hier gefunden: http://msdn.microsoft.com/en-us/library/aa366533(v=vs.85).aspx mir ist aber trotzdem nicht ganz klar wann ich welche methode anwenden soll. kann mir da jemand weiterhelfen?
-
Ich würde nach Möglchkeit keine Allokationsmethode verwenden und nach Möglichkeit die neuen intelligenten Zeiger aus C++11 nutzen (make_sahred etc...), oder vector, list etc...
Ansonsten eigentlich nur new.
malloc eigentlich nur, wenn Du C Code schreiben musst.
Außer die MSDN Doku sagt was anderes und Du benötigst GlobalAlloc/LocalAlloc.CoTaskMemAlloc wenn es im COM/Shell etc. verlangt wird...
VirtualAlloc habe ich noch nie benötigt.
-
CoTaskMemAlloc ist klar.
Ansonsten immer new.
Falls Du einen einen Allokator für höchste Geschwindigkeit baust, sollte der sich normalerweise nicht auf new stützen, sondern auf VirtualAlloc. VirtualAlloc auch dann, wenn Du Page Guards für automatisch wachstende Datenstrukturen oder sowas bauen willst.
GlobalAlloc und LocalAlloc nie. HeapAlloc nie, außer, Du willst aus Spaß oder zum Wettbewerb eine besonders kleine exe bauen und leitest new direkt auf HeapAlloc um.
Oder kürzer: Immer new, außer, man hat einen so starken Grund für etwas anderes, daß man den auch gar nicht übersehen kann.
-
volkard schrieb:
Ansonsten immer new.
Der "Trend" geht eigentlich auch dahin auch new/delete zu vermeiden.
Durch C++11 kann man mit make_unique, make_shared etc. eigentlich alles kapseln, was ein new/delete benötigt...PS: Ich weiß wie Du es meinst
-
make_unique gibts doch gar nicht.
-
314159265358979 schrieb:
make_unique gibts doch gar nicht.
Ups! Simmt. Sorry!
Muss man sich selber bauen. Ich hatte irgendwie noch die Diskussion darum im Kopf und dachte es wäre auch durchgerutscht oder war es sogar mal in boost drin? Aber irgendwas sprach dagegen.... egal...
So könnte es ausehen:
template<class T, class...Args> unique_ptr<T> make_unique(Args&&...args) { unique_ptr<T> result (new T(std::forward<Args>(args)...)); return result; }
-
Also new alloziiert nicht nur Speicher ( über malloc) sondern initialisiert auch den Typ (call 'typ::typ()') , während die anderen Methoden alle nur den Speicher alloziieren.
GlobalAlloc, LokalAlloc und malloc verwenden alle (nach meiner Kenntnis) HeapAlloc(debug/nondebug).
VirtualAlloc habe ich noch nie benutzt, daher kann ich darüber auch nÜx sagen.
@ Martin:
Hast Du gerade n Beispiel wo man unique_ptr's braucht?
Grüße
-
Hast Du gerade n Beispiel wo man unique_ptr's braucht?
Überall dort wo Du früher einen "scoped_ptr" verwendet hast oder den Besitz verschieben (nicht teilen) möchtest.
-
@Martin Richter:
make_shared ist eigentlich nicht dafür da das "new" zu verstecken, sondern eine Optimierung.
Bei Verwendung von make_shared kann das "Counter" Objekt so wie der "Deleter" mit in die Allokation für das eigentliche Objekt gepackt werden.D.h. statt 2x new (1x für das Objekt selbst + 1x für Counter & Deleter) braucht man nur 1x new. Da new üblicherweise nicht die schnellste aller Funktionen ist, macht das Sinn.
Und nachdem so eine Optimierung bei scoped_ptr/unique_ptr nicht nötig ist, gibt es auch kein make_unique.
BTW:
Ist auch gut zu wissen, denn das heisst, dass man unter bestimmten (seltenen) Bedingungen make_shared nicht verwenden sollte.
Nämlich wenn man Objekte hat die ein sehr grosses sizeof(ObjectType) und/oder sizeof(DeleterType) haben und öfters über weak_ptr referenziert werden.Die weak_ptr halten nämlich das "Counter" Objekt am Leben. Wenn das Objekt über make_shared angelegt wurde, dann wird auch der "rohe Speicher" für das eigentliche Objekt sowie seinen Deleter nicht freigegeben.
(Das Objekt selbst wird natürlich zerstört (Destruktor-Aufruf), aber da für Objekt+Counter+Deleter nur ein Speicherblock besorgt wurde, kann dieser auch erst freigegeben werden wenn der Counter nicht mehr gebraucht wird. D.h. erst nachdem alle weak_ptr auf das Objekt verschwunden sind)