C++ Academy · Oppitunti

Pinovaraukset

Näin automaattinen tallennustila toimii

Oppitunti 1/413 vaihetta

Pinovaraukset on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Automaattinen tallennustila

Paikalliset muuttujat sijaitsevat automaattisessa tallennustilassa, josta käytetään yleensä nimitystä pino. Ne luodaan, kun suoritus siirtyy niiden näkyvyysalueelle, ja tuhotaan, kun suoritus poistuu sieltä.

#include <iostream>

int main() {
    int x = 42;          // on the stack
    double pi = 3.14;    // on the stack
    std::cout << x << " " << pi << "\n";
}

Pino kasvaa ja pienenee

Jokainen funktiokutsu lisää pinoon pinokehystä, joka sisältää funktion paikalliset muuttujat. Kun funktio palaa, kehys poistetaan pinosta ja paikalliset muuttujat katoavat — manuaalista siivousta ei tarvita.

#include <iostream>

void greet() {
    int local = 7;          // pushed on call
    std::cout << local << "\n";
}                            // popped on return

int main() { greet(); }

LIFO-järjestys

Pino toimii periaatteella viimeisenä sisään, ensimmäisenä ulos. Viimeksi luotu paikallinen muuttuja tuhotaan ensimmäisenä, kun näkyvyysalue päättyy.

#include <iostream>

int main() {
    int a = 1;
    {
        int b = 2;   // created after a
        std::cout << b << "\n";
    }                // b destroyed first
    std::cout << a << "\n";
}

Nopea ja edullinen

Pinomuistin varaaminen on erittäin nopeaa: se siirtää vain pinon osoitinta. Vapaata muistia ei tarvitse etsiä eikä tehdä kirjanpitoa, jota kekomuisti edellyttää.

Näkyvyysalue määrittää eliniän

Pinomuistissa oleva olio on olemassa vain sen lohkon sisällä, jossa se ilmoitetaan. Sisäkkäisillä lohkoilla on omat näkyvyysalueensa.

#include <iostream>

int main() {
    for (int i = 0; i < 3; ++i) {
        int square = i * i;   // recreated each iteration
        std::cout << square << "\n";
    }
}

Rajallinen koko

Pinolla on kiinteä ja rajallinen koko, usein muutama megatavu. Suurten taulukoiden varaaminen pinoon voi aiheuttaa pinon ylivuodon ja ohjelman kaatumisen.

// Risky: a large fixed array on the stack
int big[1000000];   // may overflow the stack

Pino-osoitteen palauttaminen on virhe

Älkää koskaan palauttako osoitinta tai viitettä paikalliseen muuttujaan. Kun funktio palaa, kyseinen tallennustila katoaa ja osoittimesta tulee roikkuva.

int* bad() {
    int local = 5;
    return &local;   // BUG: local dies here
}

Välittäkää suuret oliot viitteenä

Suurten olioiden kopioiminen pinoon on tuhlailevaa. Välittäkää ne const&-viitteinä, jotta kopio vältetään ja pinon käyttö pysyy vähäisenä.

#include <string>

void print(const std::string& s) {  // no copy
    // use s
}

Pinon oliot eivät tarvitse delete-kutsua

Koska kääntäjä hallitsee niiden elinkaarta automaattisesti, pinomuuttujalle ei saa koskaan kutsua delete-operaattoria.

#include <iostream>

int main() {
    int n = 10;
    // delete &n;   // ERROR: not heap-allocated
    std::cout << n << "\n";
}

Taulukot pinossa

Kiinteän kokoiset, tunnetun pituiset taulukot sijaitsevat pinossa ja vapautetaan automaattisesti, kun näkyvyysalue päättyy.

#include <iostream>

int main() {
    int values[3] = {10, 20, 30};
    for (int v : values) std::cout << v << "\n";
}

Milloin pinoa kannattaa suosia

Suosikaa pinoa pienille ja lyhytikäisille olioille, joiden koko tunnetaan käännösaikana. Pino on nopea ja huolehtii vapautuksesta itse — käyttäkää kekoa vain silloin, kun sitä todella tarvitaan.

Pikatesti

Testatkaa ymmärrystänne pinomuistin varauksesta.

Kertaus

Opitte, että pinomuistin varaus käyttää näkyvyysalueeseen sidottua automaattista säilytystilaa: muuttujat luodaan alueelle tultaessa ja tuhotaan sieltä poistuttaessa LIFO-järjestyksessä. Pino on nopea ja vapauttaa muistinsa itse, mutta sen koko on rajallinen. Älkää koskaan palauttako paikallisten muuttujien osoitteita älkääkä kutsuko delete-operaattoria pinon olioille.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Pinovaraukset” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Pinovaraukset”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Pinovaraukset”?

Näin automaattinen tallennustila toimii Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Pinovaraukset”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Pinovaraukset
  2. Keon varaus new/delete-operaatioilla
  3. Olion elinkaari
  4. Yleiset muistivirheet
← Takaisin: C++ Academy