Reprezentarea haldelor și stivei - depășirea stivei în limba rusă

@voip: Nu cred că informațiile pe care le citiți sunt adevărate. Cum @DreamChild a spus corect, atât stiva și șoldul nu sunt nimic mai mult decât hardware. Faptul că stiva este mai mică decât dimensiunea heap de obicei, nu înseamnă nimic: puteți accesa datele de pe stivă hipe local și nelocal. (Te referi la punerea în cache la nivelul procesorului, dar aceasta nu funcționează așa cum crezi.) Registrele în limbaje de nivel înalt nu este și nu va fi niciodată, din mai multe motive (de exemplu, deoarece compilatorul de optimizare poate optimiza o persoană mai bună.) - Vladd 5 decembrie '13 la 11:48







  1. Atât stiva, cât și halda sunt atât fizic în RAM (nu considerăm dislocări arhitecturale folosind procesoare / calculatoare speciale)
  2. Dimensiunile și localizarea acestora sunt determinate de axă
  3. În acest caz, halda poate fi fragmentată (uneori destul de puternică). De obicei, axele au proceduri speciale pentru defragmentarea haldei.
  4. De obicei, stiva nu este niciodată fragmentată (probabil că puteți ajunge la o implementare de stivă cu fragmentare, dar este un oximoron).
  5. Stiva pare să fie mai rapidă, deoarece are un singur parametru care funcționează - este un indicator pentru poziția stivei (de obicei, un registru) - astfel încât toate operațiile cu stivă funcționează de multe ori mai repede decât cu o grămadă. Operația de extragere / scriere din teanc este o mișcare a procesorului POP / PUSH
  6. Cu o grămadă este mai dificilă din cauza fragmentării sale și o simplă operațiune de extragere a valorii din ea poate avea ca rezultat zeci (dacă nu sute) din mișcările corpului procesorului.
  7. Redresarea în dimensiunile dimensiunii sale (este întotdeauna un ordin de mărime mai mică decât heapul) - bine, că accesul la acesta este doar consecvent.

răspuns primit 6 decembrie '13 la 18:47

@Barmaley: 6) Este logic să aloce memorie pe heap, dar dacă aveți un pointer la un obiect pe heap, și un pointer la un obiect de pe stivă, viteza de acces strict identice. 7) Din nou, accesul nu se face prin lectură succesivă, ci prin dereferențierea indicatorului. - VladD 6 decembrie '13 la 20:15

Într-adevăr, viteza de acces la datele din stack și heap este aceeași. Ie 5) și 6) aceasta este o eroare. Nu am fost leneș și verificat timpul de umplere (mai multe tentative), o matrice de 2 milioane. Int (mai mult în stivă nu am potrivesc) în grămadă și stivă. void umple (int a [], int n) Această metodă este aleasă pentru a minimiza influența cache-ului și prefetch-ul datelor în el. Rezultatele (clock_gettime (CLOCK_THREAD_CPUTIME_ID, ts);) ./a.out 100 stiva: avg: 43.332 (msec) heap: avg: 42.283 (msec) - avp ​​06 decembrie '13 22:14







@avp nu trebuie să încercăm să, este necesar să se asigure că o grămadă de fragmentat - în acest scop, este necesar să se facă nor o alocare aleatoriu de mărimi diferite și, de asemenea, în mod aleatoriu a le elimina, doar atunci verifica viteza de acces la o gamă largă de pe movila (!). În caz contrar, dacă halda nu este fragmentată, viteza va fi, desigur, aceeași. - Barmaley 8 decembrie '13 la 18:47

Deși a trecut mult timp de când ați pus întrebarea, aș dori să răspund, din moment ce această problemă este încă „Google“ și cred că multe altele vor vizita aceasta pagina.

Așa cum ați răspuns deja "fizic" - este vorba de tranzistori și condensatori. Așadar, întrebarea însăși nu a fost transmisă corect. Probabil ai vrut să spui ceva de genul: "Unde este mormanul și stiva, cum sunt aranjate".

De asemenea. probabil. sunteți interesat în general aranjate în memorie, ilumina pe deplin această întrebare nu voi, dar vreau să-ți arăt o exhaustivă, în opinia mea, materialul, și să ofere link-uri către ele. Materiale în limba rusă. Trebuie să înțelegeți care este memoria virtuală și modul în care aceasta este tradusă în memoria fizică.

Iată un exemplu de organizare a memoriei segmentului.

Reprezentarea haldelor și stivei - depășirea stivei în limba rusă

Acesta este un scurt și un pic despre prezentarea de memorie virtuală în fizică.

Cu privire la dispozitivul de memorie din interiorul procesului:

Reprezentarea haldelor și stivei - depășirea stivei în limba rusă

Ce este stocat în blocul CODE, precum și multe alte lucruri pe care le puteți găsi din materialele recomandate de mine în acest răspuns.

Este mai bine să spunem așa. Operațiile tipice atunci când se lucrează cu memoria sunt alocarea / dezalocarea și citirea / scrierea. Operația de alocare și eliberare a memoriei este mai lentă în heap.

Dacă, de exemplu, vom introduce un pointer la datele situate pe stivă, atunci nu va fi absolut nici o diferență în viteza de acces.

răspunsul dat 7 decembrie '13 la 6:11 am

"Accesul la date (citire / scriere) are loc cu aproape aceeași viteză." Și dacă datele sunt fragmentate, nu le citești să încetinească? - voipp Dec 7 '13 la 11:14 am

@voipp: Ce înseamnă "date fragmentate"? Dacă vorbim despre fragmentarea unei matrice, atunci acest lucru nu se întâmplă, matricea merge întotdeauna la rând. Dacă vorbiți despre accesarea diferitelor obiecte, ele pot fi stocate în memorie și când sunt amplasate pe teanc și pe heap. - VladD 7 decembrie '13 la 11:57

Da, eu sprijin @VladD. Structura nu poate fi fragmentată. Dacă aveți o structură pe stivă cu std :: șir, atunci conținutul liniei, de obicei, este deja în halda :). Mai degrabă, trebuie să vă gândiți la structurile de date care merită folosite, și nu la locația acestora. Lista, de exemplu, poate fi uneori mai bună decât o matrice, dar este predispusă la fragmentare (și consumă mai multă memorie). - Михаил М 8 decembrie '13 la 9:01







Articole similare

Trimiteți-le prietenilor: