Sobes.tech
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 const arba turintys statinį galiojimo laiką, inicijuojami programos įkėlimo metu.
  • 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