Pinovaraukset
Näin automaattinen tallennustila toimii
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 stackPino-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.
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.