C ++, Free-Store vs Heap

124

new/deleteMówi się, że dynamiczne alokacje mają miejsce w wolnym magazynie ,
podczas gdy malloc/freeoperacje 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)

Nick Dandoulakis
źródło

Odpowiedzi:

76

Zobacz http://www.gotw.ca/gotw/009.htm ; może opisać różnice między stertą a darmowym sklepem znacznie lepiej niż ja:

Darmowy sklep:

Wolny magazyn jest jednym z dwóch dynamicznych obszarów pamięci, przydzielanych / zwalnianych przez nowy / usuń. Okres istnienia obiektu może być krótszy niż czas przydzielenia magazynu; to znaczy wolne obiekty magazynu mogą mieć przydzieloną pamięć bez natychmiastowej inicjalizacji i mogą zostać zniszczone bez natychmiastowego zwalniania pamięci. W okresie, w którym pamięć jest przydzielona, ​​ale poza okresem istnienia obiektu, można uzyskać do niej dostęp i można nią manipulować za pomocą pustej przestrzeni *, ale nie można uzyskać dostępu do niestatycznych elementów członkowskich ani funkcji składowych proto-obiektu, pobierać ich adresów ani w inny sposób nimi manipulować .

Sterta:

Sterta to drugi obszar pamięci dynamicznej, przydzielany / zwalniany przez malloc / free i ich warianty. Zauważ, że chociaż domyślne globalne nowe i usuwanie mogą być implementowane w kategoriach malloc i wolne przez określony kompilator, sterta nie jest tym samym, co wolne miejsce i pamięć przydzielona w jednym obszarze nie może być bezpiecznie zwolniona w drugim. Pamięć przydzieloną ze sterty można wykorzystać dla obiektów typu klasowego przez umieszczenie-nową konstrukcję i jawne zniszczenie. Jeśli tak jest używany, uwagi dotyczące okresu istnienia bezpłatnego obiektu magazynu mają tutaj zastosowanie podobnie.

Michael Koval
źródło
23
Nie zgadzam się. Słowo „sterta” w kontekście alokacji dynamicznej nie jest używane ani w standardzie C ++, ani w C99 (nie mam C89, do którego odwołuje się C ++, popraw mnie, jeśli używa tego słowa). Nie mogłem znaleźć daty opublikowania przedmiotowego GotW, ale ponieważ mówi o wersji roboczej, jest to oczywiście przedstandardowe.
avakar
2
To wszystko kwestia terminologii, imho. Powiedz, mr. Stroustrup nie rozróżnia „sterty” i „wolnego sklepu”: stroustrup.com/Programming/17_free_store.ppt , slajd 12. „Sterta” była używana jako synonim pamięci dynamicznej dawno przed C ++, od czasów Lispa (lata 60. XX wieku) struktura danych sterty do alokacji pamięci.
Alexey Voytenko
Generalnie myślę o kupie (via maloc / free) jako o pewnym rodzaju dostawcy „surowca”. Pytasz o kawałek pamięci, nie dostajesz żadnych dodatków. Wszelkie konstrukcje musisz budować samodzielnie. Darmowy sklep (nowy / usuń) bardziej przypomina dostawcę „gotowych towarów”. Pytasz o obiekt, a przydzielana jest mu przestrzeń i obiekt, który zbudował i przygotował do użytku. Po skończeniu ładnie się czyści.
Anshuman Kumar
67

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 „ newi deleteskorzystać z bezpłatnego sklepu, malloci freeużyć sterty; newi deletewywołać konstruktora i destruktora, odpowiednio, jednak malloci freetego 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ż).

Zestaw 10
źródło
28

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”.

Crashworks
źródło
5

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.

Jim Lewis
źródło
3

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

Ambroise Leclerc
źródło
2

Nie przypominam sobie standardu kiedykolwiek wspominającego o słowie sterta, z wyjątkiem opisów funkcji sterty, takich jak push_heapet al. Wszystkie alokacje dynamiczne są wykonywane w wolnym sklepie.

avakar
źródło
1

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.

Sudipto
źródło