Junior
Kada ir kaip ilgai egzistuoja globalios ir vietinės kintamosios C++?
sobes.tech AI
Atsakymas iš AI
Pasaulinės kintamosios
- Gyvavimo laikas: Nuo programos paleidimo iki jos užbaigimo.
- Saugojimo vieta: Paprastai statinėje atminties srityje (.data arba .bss sekcijoje vykdomajame faile).
- Inicijavimas:
- Nestatinių pasaulinių kintamųjų, apibrėžtų failo lygyje, su netrivialiais konstruktoriais, inicijuojami prieš
main()iškvietimą. - Nulinės inicijalizacijos pasauliniai kintamieji (pvz., int i = 0;) taip pat inicijuojami prieš
main(). - Kintamieji, apibrėžti su
constarba turintys statinį galiojimo laiką, inicijuojami programos įkėlimo metu.
- Nestatinių pasaulinių kintamųjų, apibrėžtų failo lygyje, su netrivialiais konstruktoriais, inicijuojami prieš
- Prieinamumas: matomi visuose funkcijose, kuriose yra jų sritis.
Vietiniai kintamieji
- Gyvavimo laikas: nuo kintamojo apibrėžimo vietos bloko viduje (funkcijoje, cikle, sąlygos sakinyje ir t.t.) iki išėjimo iš šio bloko.
- Saugojimo vieta: paprastai ant steko (automatiniai kintamieji). Statiniai vietiniai kintamieji saugomi statinėje atmintyje.
- Inicijavimas:
- Automatiniai vietiniai kintamieji nėra inicijuojami pagal nutylėjimą (laikomi "šiukšliai"). Reikalauja aiškios inicijalizacijos.
- Statiniai vietiniai kintamieji inicijuojami vieną kartą, kai pirmą kartą pasiekiami.
- Prieinamumas: matomi tik toje kodo srityje, kurioje yra apibrėžti.
Pavyzdžiai
// Pasaulinė kintamoji
int global_variable = 10;
void some_function() {
// Vietinė kintamoji (automatinė)
int local_variable_1; // Neinicijuota
// Vietinė kintamoji (automatinė) su inicijavimu
int local_variable_2 = 20;
// Statinė vietinė kintamoji
static int static_local_variable = 30; // Inicijuojama vieną kartą
// Prieiga prie pasaulinės kintamosios
global_variable++;
// Prieiga prie vietinių kintamųjų
local_variable_1 = global_variable;
static_local_variable++;
// Išėjus iš some_function(), local_variable_1 ir local_variable_2 nustoja egzistuoti
// static_local_variable toliau egzistuoja ir išlaiko savo reikšmę
}
int main() {
some_function();
some_function(); // static_local_variable išlaiko savo reikšmę
// Pasaulinė kintamoji yra pasiekiama čia
// local_variable_1 ir local_variable_2 nėra pasiekiami
return 0;
}
Palyginimo lentelė
| Savybė | Pasaulinės kintamosios | Vietinės kintamosios (automatinės) | Statinės vietinės kintamosios |
|---|---|---|---|
| Gyvavimo laikas | Nuo programos paleidimo iki jos užbaigimo | Nuo apibrėžimo iki išėjimo iš kodo bloko | Nuo pirmojo pasiekimo iki programos pabaigos |
| Saugojimo vieta | Statinėje atmintyje (.data, .bss) | Steke | Statinėje atmintyje (.data, .bss) |
| Inicijavimas | Prieš main() iškvietimą arba įkeliant programą |
Nėra automatiškai inicijuojami. Reikalauja aiškios inicijalizacijos | Vieną kartą, pirmojo pasiekimo metu |
| Prieinamumas | Visur srities ribose | Tik toje kodo srityje, kurioje apibrėžti | Tik toje kodo srityje, kurioje apibrėžti |