malloc() free() realloc()?
-
Hi,
die C++ quasi Gegenstücke zu malloc() und free() sind ja new und delete bzw new[] und delete[]. Habe ich das so richtig verstanden? (Denke mal doch ;))
Nur gibts jetzt auch was für realloc?
-
Ja, im Prinzip sind es die Gegenstücke im Bezug auf manuelle Speicherverwaltung.
Wobei du in C++ eben trotzdem nicht
newschreibst, wo einmalloc()in C stand. Vermeide manuelle Speicherverwaltung so oft es geht, und benutze RAII. Dinge wie Container und Smart-Pointer sind wohl die bekanntesten Beispiele für das RAII-Idiom.Das mit
realloc()erledigt sich dann auch gleich, weil z.B. STL-Container sich automatisch vergrössern, ohne dass du explizit was tun musst.
-
Nexus schrieb:
Das mit
realloc()erledigt sich dann auch gleich, weil z.B. STL-Container sich automatisch vergrössern, ohne dass du explizit was tun musst.Und was verwenden die? Im Prinzip müssten sie ja auch realloc() verwenden, weil es u.U. effizienter ist, als neuen Speicher mit new[] anzufordern.
-
wxSkip schrieb:
Und was verwenden die?
Intelligente Allokationsstrategien, sodass z.B. nur bei Zweierpotenzen eine Anforderung notwendig wird. Dadurch sind
push_back()etc. amortisiert O(1).wxSkip schrieb:
Im Prinzip müssten sie ja auch realloc() verwenden, weil es u.U. effizienter ist, als neuen Speicher mit new[] anzufordern.
realloc()kannst du in C++ gleich vergessen.Der Grund ist, dass es manchmal den ganzen Speicherbereich umkopiert, aber du nicht herausfinden kannst, wann. Und byteweises Kopieren von Nicht-PODs ist in C++ undefiniertes Verhalten.
-
Nexus schrieb:
wxSkip schrieb:
Und was verwenden die?
Intelligente Allokationsstrategien, sodass z.B. nur bei Zweierpotenzen eine Anforderung notwendig wird. Dadurch sind
push_back()etc. amortisiert O(1).wxSkip schrieb:
Im Prinzip müssten sie ja auch realloc() verwenden, weil es u.U. effizienter ist, als neuen Speicher mit new[] anzufordern.
realloc()kannst du in C++ gleich vergessen.Der Grund ist, dass es manchmal den ganzen Speicherbereich umkopiert, aber du nicht herausfinden kannst, wann. Und byteweises Kopieren von Nicht-PODs ist in C++ undefiniertes Verhalten.
Stimmt, nicht dran gedacht
.
Dennoch könnte es ja sein, dass wenn du Speicher mit new[] anforderst, dahinter noch freier Speicher liegt, den du theoretisch nutzen könntest. Warum gibt es keine solche Allokationsfunktionen in C und C++, mit denen man abfragen kann, wie viel Speicher das Betriebssystem dahinter noch freihält und diesen dann ggf. nutzen kann?
-
std::allocator (welchen die Standard-Container benutzen) hat ein Interface, das einer Implementation ein solches Verhalten ermöglicht. Ob es eine Implementation gibt, die davon Gebrauch macht, weiß ich nicht.
-
seldon schrieb:
std::allocator (welchen die Standard-Container benutzen) hat ein Interface, das einer Implementation ein solches Verhalten ermöglicht. Ob es eine Implementation gibt, die davon Gebrauch macht, weiß ich nicht.
Du meinst vermutlich den "hint" den man bei "allocate" mitgeben kann.
Damit kann man allerdings realloc() nicht nachbilden, da man bei std::allocator trotzdem wieder zwei getrennte Allokationen hat, die man auch getrennt wieder freigeben muss.