Pointeri în C De ce, când și modul de utilizare diferit de referinta la obiectul direct
Dar, dacă vom obține un impuls de viteză, apelând direct la memorie?
De fapt, nu este deloc. Lucrul cu indicii încadrate într-o grămadă, în timp ce lucrează cu obiecte - această stivă, o structură simplă și rapidă. Dacă sunteți un începător, avem lucruri pentru tine, în care ne spunem în detaliu ce stivă și grămadă.
Strict vorbind, această întrebare combină două întrebări diferite. Primul este de a utiliza atunci când alocarea dinamică a memoriei? În al doilea rând: când să utilizeze indicii? Desigur, aici nu putem face fără cuvinte comune, care sunt întotdeauna necesare pentru a alege instrumentul cel mai adecvat pentru locuri de muncă. Aproape întotdeauna există realizarea unei mai bune decât folosind o alocare manuală dinamică (alocare dinamică) și / sau indicii prime.
alocarea dinamică
două moduri de a crea un obiect reprezentat în formularea întrebării. Iar principala diferență constă în durata de viață a acestora (durata de depozitare), în memoria de program. Utilizarea myObject obiect;. vă bazați pe detectarea automată a duratei de viață, iar obiectul va fi distrus imediat după lansarea domeniului său de aplicare. Dar Object * myObject = obiect nou; Aceasta salvează viața proiectului până la momentul până când îl ștergeți manual din memorie șterge comanda. Utilizați ultima opțiune numai atunci când este cu adevărat necesar. Deci, întotdeauna opta pentru determinarea automată a perioadei de depozitare, dacă este posibil.
De obicei, stabilirea pe termen obligatorie a vieții este folosită în următoarele situații:
- Ai nevoie de obiect a existat și după părăsirea zonei de vizibilitate sale - acesta este obiectul, este în această zonă de memorie și nu o copie. Dacă pentru tine nu contează (în cele mai multe cazuri, este), se bazează pe determinarea automată a duratei de viață. Dar iată un exemplu de o situație în care poate fi necesar să atragă obiectul în afara domeniului său de aplicare, dar se poate face fără a salva în mod explicit: scrierea obiectului într-un vector, puteți „rupe legătura“ cu obiectul în sine - de fapt, el (ca nu este o copie a acestuia) va fi disponibilă atunci când este solicitat de vectorul.
- Trebuie să utilizați o mulțime de memorie. care poate overflow stiva. Mare, dacă o astfel de problemă nu trebuie să se confrunte (și fața ei este foarte rar), pentru că este „în afara competenței» C ++, dar, din păcate, uneori este necesar pentru a rezolva această problemă.
- De exemplu, nu știi exact dimensiunea de matrice, care ar trebui să fie utilizate. După cum se știe, în C ++ matrice în determinarea o dimensiune fixă. Acest lucru poate cauza probleme, de exemplu, atunci când citirea datele introduse de utilizator. Pointer precizează, de asemenea, numai acea parte a memoriei, care va fi înregistrată începând de matrice, aproximativ vorbind, nu este limitativă dimensiunea sa.
În cazul în care utilizarea de alocare dinamică este necesară, ar trebui să-l încapsula cu un pointer inteligent (care este un pointer inteligent poate fi citit în articolul nostru), sau alt tip de sprijin idiom „raii“ (containere standard, acesta susține - este un idiom, în conformitate cu în care resursa: o unitate de memorie, un fișier, o conexiune de rețea, și altele asemenea - la primirea inițializată în constructor si destructor apoi cu atenție distruse). Inteligente acestea sunt, de exemplu, std :: unique_ptr indicii si std :: shared_ptr.
Cu toate acestea, există cazuri în care utilizarea de indicatori este justificată nu numai în ceea ce privește alocarea dinamică a memoriei, dar au aproape întotdeauna o cale alternativă, fără utilizarea de indicii pe care le și ar trebui să alegeți. Ca și în trecut, să zicem, opta întotdeauna pentru o alternativă în cazul în care nu este nevoie specială de a utiliza indicii.
Cazurile în care utilizarea de indicii pot fi considerate ca o opțiune, includ următoarele: