new/delete
Mówi się, że dynamiczne alokacje mają miejsce w wolnym magazynie ,
podczas gdy malloc/free
operacje używają sterty .
Chciałbym wiedzieć, czy w praktyce istnieje różnica.
Czy kompilatory rozróżniają te dwa terminy? ( Darmowy sklep i Heap , nie new/malloc
)
źródło
W C ++ różnica między darmowym magazynem a stertą stała się czysto koncepcyjna. Jak słoik do zbierania błędów i jeden do zbierania ciastek. Jeden jest oznaczony w jeden sposób, a drugi w inny. To oznaczenie ma na celu wskazanie punktu, w którym NIGDY nie mieszasz "
new
" i "delete
" z "malloc
", "realloc
" lub "free
" (lub zestawami poziomów bitowych w tym zakresie).Podczas wywiadów dobrze jest powiedzieć, że „
new
idelete
skorzystać z bezpłatnego sklepu,malloc
ifree
użyć sterty;new
idelete
wywołać konstruktora i destruktora, odpowiednio, jednakmalloc
ifree
tego nie robią.” Jednak często można usłyszeć, że segmenty pamięci znajdują się naprawdę w tym samym obszarze - jednak może to być specyficzne dla kompilatora, to znaczy jest możliwe, że oba mogą wyznaczyć różne przestrzenie pamięci jako pule (nie wiem, dlaczego tak się dzieje, chociaż).źródło
Odpowiedź Mike'a Kovala całkiem dobrze pokrywa teorię. W praktyce są to jednak prawie zawsze ten sam region pamięci - w większości przypadków, jeśli zagłębisz się w implementację kompilatora
new
, zobaczysz, że wywołujemalloc()
.Innymi słowy: z punktu widzenia maszyny sterta i wolny magazyn to to samo. To rozróżnienie istnieje wewnątrz kompilatora.
Żeby było jeszcze bardziej zagmatwać, przed nadejściem C ++ mówiliśmy, że „sterta” oznacza to, co obecnie nazywa się „darmowym magazynem”.
źródło
Termin „sterta” może również odnosić się do określonej struktury danych, ale w kontekście operacji malloc w języku C ++, free, new i delete terminy „sterta” i „wolny magazyn” są używane mniej lub bardziej zamiennie.
źródło
Heap i free-store nie powinny być interoperacyjne. W ograniczonych kontekstach, takich jak 8-bitowe mikrokontrolery AVR z biblioteką standardową c ++ 11, nie można ich nawet używać w tym samym programie. Free store i heap dokonują alokacji w tej samej przestrzeni pamięci, nadpisując nawzajem struktury i dane. W tym kontekście Free store jest inny i niekompatybilny z Heap, ponieważ „nowa / usuń bezpłatną bibliotekę magazynu” jest prostsza (i szybsza) niż „Malloc / free / realloc / calloc heap library”, a tym samym zapewnia ogromne zyski w zużyciu pamięci dla Wbudowany programator C ++ (w kontekście, w którym masz tylko 512 bajtów pamięci RAM).
Zobacz 8-bitową bibliotekę standardową c ++ 11/14 pod adresem https://github.com/ambroise-leclerc/ETL/tree/master/libstd
źródło
Nie przypominam sobie standardu kiedykolwiek wspominającego o słowie sterta, z wyjątkiem opisów funkcji sterty, takich jak
push_heap
et al. Wszystkie alokacje dynamiczne są wykonywane w wolnym sklepie.źródło
Wolny magazyn to pula nieprzydzielonej pamięci sterty przydzielona programowi, który jest używany przez program do dynamicznej alokacji podczas wykonywania programu. Każdy program jest wyposażony w pulę nieprzydzielonej pamięci sterty, którą może wykorzystać podczas wykonywania. Ta pula dostępnej pamięci jest nazywana wolną pamięcią programu. Przydzielona wolna pamięć magazynu nie ma nazwy.
źródło