Što i gdje su stog i hrpa?

Knjige u programskim jezicima objašnjavaju da su tipovi vrijednosti stvoreni na stogu , a referentni tipovi su stvoreni na hrpi , bez objašnjavanja što su te dvije stvari. Nisam pročitao jasno objašnjenje za to. Razumijem što je stog. Međutim,

  • gdje i što su (fizički u stvarnoj memoriji računala)?
  • U kojoj mjeri su pod kontrolom operativnog sustava ili jezika?
  • Koji je njihov volumen?
  • Što određuje veličinu svakog od njih?
  • Što je brže?
7380
17 сент. set mattshane 17 sep . 2008-09-17 07:18 '08 u 7:18 am 2008-09-17 07:18
@ 25 odgovora

Stack je memorija odvojena kao scratch prostor za nit izvršenja. Kada se pozove funkcija, blok je rezerviran na vrhu stog za lokalne varijable i neke vjerodajnice. Kada se ova funkcija vrati, blok postaje neiskorišten i može se upotrijebiti sljedeći put kada se funkcija pozove. Stog je uvijek rezerviran redoslijedom LIFO (posljednji u prvom redu); najnoviji rezervirani blok je uvijek sljedeći blok koji će biti oslobođen. To olakšava praćenje stogova; oslobađanje bloka od stog nije ništa drugo nego podešavanje jednog pokazivača.

Gomila je memorija dodijeljena za dinamičku dodjelu. Za razliku od snopa, nema prisilnog predloška za dodjeljivanje i oslobađanje blokova iz hrpe; Blok možete odabrati u bilo kojem trenutku i objaviti ga u bilo kojem trenutku. Zbog toga je vrlo teško pratiti koji se dijelovi hrpe distribuiraju ili oslobađaju u bilo kojem trenutku; Postoje mnogi prilagođeni cum distributeri za podešavanje performansi hrpe za različite obrasce korištenja.

Svaka nit prima stog, dok se za aplikaciju obično koristi samo jedna gomila (iako nije neobično imati nekoliko gomila za različite tipove položaja).

Da biste izravno odgovorili na svoja pitanja:

U kojoj mjeri su pod kontrolom operativnog sustava ili jezika?

OS dodjeljuje stog za svaku niti na razini sustava prilikom kreiranja niti. Tipično, OS se poziva okruženjem izvršenja jezika da dodijeli hrpu za aplikaciju.

Koji je njihov volumen?

Snop je pričvršćen na nit, tako da kada nit izlazi iz snopa, ona se ispravlja. Gomila se obično dodjeljuje kada je aplikacija pokrenuta u vrijeme izvođenja i vraća se nakon što aplikacija (tehnički proces) izađe.

Što određuje veličinu svakog od njih?

Veličina stogova postavlja se prilikom kreiranja niti. Veličina hrpe se postavlja kada se aplikacija pokrene, ali se može povećati ako je potrebno (raspodjeljivač zahtijeva više memorije iz operativnog sustava).

Što je brže?

Stack je brži jer pristupni uzorak čini trivijalnim dodijeliti i osloboditi memoriju iz njega (pokazivač / cijeli broj jednostavno raste ili se smanjuje), a gomila ima mnogo složenije financijske izjave vezane uz dodjelu ili oslobađanje. Osim toga, svaki bajt u stogu se često ponovno koristi, što znači da se obično prikazuje u predmemoriji procesora, što ga čini vrlo brzim. Još jedan hit izvedbe hrpe je da gomila, koja je uglavnom globalni resurs, obično treba biti višestruka, tj. Svaka distribucija i izdanje trebaju biti - u pravilu, sinkronizirani s "svim" drugim pozivima u programu.

Obriši demonstraciju: 2019

5436
17 сент. Odgovor je dat Jeff Hill 17 sep. 2008-09-17 07:52 '08 u 7:52 am 2008-09-17 07:52

stog

  • Spremljen u RAM-u računala, kao hrpa.
  • Varijable stvorene na stogu izlaze izvan dosega i automatski se oslobađaju.
  • Mnogo brže alocirati u usporedbi s varijablama u hrpi.
  • Implementirano sa stvarnom strukturom podataka o stogu.
  • Sprema lokalne podatke, vraća adrese korištene za prosljeđivanje parametara.
  • Može imati prelijevanje stog kada se koristi previše stog (uglavnom od beskonačne ili previše duboke rekurzije, vrlo velike distribucije).
  • Podaci stvoreni na stogu mogu se koristiti bez pokazivača.
  • Stack bi koristio ako biste točno znali koliko podataka morate alocirati prije kompajliranja, a to nije preveliko.
  • Obično je maksimalna veličina već određena kada se program pokrene.

Skupi:

border=0
  • Pohranjuje se u memoriju računala na isti način kao i snop.
  • U C ++, varijable u hrpi moraju se ručno uništiti i nikada ne ispadaju iz dosega. Podaci se oslobađaju delete , delete[] ili free .
  • Sporije je alocirati u usporedbi s varijablama u stogu.
  • Koristi se na zahtjev za dodjelu bloka podataka za korištenje u programu.
  • Može imati fragmentaciju kada postoje brojna izdvajanja i izuzeća.
  • U C ++ ili C, podaci stvoreni na hrpi bit će označeni pokazivačima i dodijeljeni new odnosno malloc .
  • Može se dogoditi da se ne distribuira ako je potrebno previše međuspremnika.
  • Koristili biste hrpu ako ne znate točno koliko podataka trebate u vrijeme izvođenja ili ako trebate dodijeliti mnogo podataka.
  • Odgovoran za curenje memorije.

primjer:

2164
17 сент. Odgovor je dao Brian R. Bondy 17 sep. 2008-09-17 07:20 '08 u 7:20 2008-09-17 07:20

Najvažnija stvar je da su hrpa i stog opći pojmovi za metode dodjele memorije. Mogu se implementirati na različite načine, a ti su pojmovi primjenjivi na osnovne pojmove.

  • U snopu elemenata elementi se postavljaju jedan na drugi u redoslijedu kojim su smješteni tamo, a gornji dio možete ukloniti (bez naginjanja cijele stvari).

    2019

1294
19 марта '09 в 17:38 2009-03-19 17:38 odgovor je dao thomasrutter 19. ožujka u 17:38 2009-03-19 17:38

(Taj sam odgovor prebacio s drugog pitanja koje je manje ili više prevario.)

Odgovor na vaše pitanje je specifičan za implementaciju i može se razlikovati između kompajlera i arhitektura procesora. Međutim, ovo je pojednostavljeno objašnjenje.

  • I stog i hrpa su memorijska područja dodijeljena iz osnovnog operativnog sustava (često virtualna memorija, koja se mapira na fizičku memoriju na zahtjev).
  • U okruženju s više navoja, svaka će nit imati svoj vlastiti potpuno neovisan stog, ali će razdvojiti hrpu. Paralelni pristup mora biti kontroliran na hrpi i nije moguć na hrpi.

Gomila

  • Gomila sadrži povezani popis korištenih i slobodnih blokova. Nove dodjele gomile ( new ili malloc ) su zadovoljene stvaranjem prikladnog bloka iz jednog od slobodnih blokova. To zahtijeva ažuriranje popisa blokova na hrpi. Ova meta informacija o blokovima u hrpi također je pohranjena u hrpi, često na malom području neposredno prije svakog bloka.
  • Kako gomila raste, novi se blokovi često dodjeljuju s nižih adresa na više adrese. Dakle, gomilu možete zamisliti kao hrpu memorijskih blokova koji rastu u veličini kako je memorija dodijeljena. Ako je gomila premala za distribuciju, veličina se često može povećati prikupljanjem više memorije iz temeljnog operativnog sustava.
  • Dodjeljivanje i oslobađanje mnogih malih blokova može ostaviti hrpu u stanju u kojem postoji mnogo malih slobodnih blokova raspoređenih između korištenih blokova. Zahtjev za dodjelu velikog bloka može biti neuspješan, jer niti jedan od slobodnih blokova nije dovoljno velik da zadovolji zahtjev distribucije, čak i ako kombinirana veličina slobodnih blokova može biti dovoljno velika. To se naziva fragmentacija hrpe.
  • Kada se koristi blok koji se nalazi u blizini slobodnog bloka, novi slobodni blok može se kombinirati sa susjednim slobodnim blokom kako bi se stvorio veći slobodni blok koji učinkovito smanjuje fragmentaciju hrpe.

2019

681
31 июля '09 в 18:54 2009-07-31 18:54 Odgovor daje Martin Liversage 31. srpnja u 18:54 2009-07-31 18:54

U sljedećem kodu C #

var _tmr = window._tmr || (window._tmr = []);_tmr.push({id: "2334768", type: "pageView", start: (new Date()).getTime()});(function (d, w, id) {  if (d.getElementById(id)) return;  var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id;  ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js";  var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};  if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }})(document, window, "topmailru-code");