Staattinen muuttuja - Static variable
Vuonna ohjelmointi , joka on staattinen muuttuja on muuttuja , joka on varattu "staattisesti", mikä tarkoittaa, että sen käyttöikä (tai "määrin") on koko painoksen ohjelman. Tämä on toisin kuin lyhyemmän eli automaattinen muuttujia , joiden varastointi on pino jaetaan ja deallokoida on kutsupino ; ja toisin kuin kohteet , joiden tallennustila on dynaamisesti varattu ja sijoitettu kasan muistiin .
Muuttujan käyttöikä on vastakohtana laajuudelle (jossa muuttujaa voidaan käyttää): "globaali" ja "paikallinen" viittaavat laajuuteen, eivät elinikään, mutta laajuus merkitsee usein käyttöikää. Monilla kielillä globaalimuuttujat ovat aina staattisia, mutta joillakin kielillä ne ovat dynaamisia, kun taas paikalliset muuttujat ovat yleensä automaattisia, mutta voivat olla staattisia.
Yleisesti, staattinen muistin varaus on muistin varaaminen käännöshetkellä, ennen kuin siihen liittyvä ohjelma suoritetaan, toisin kuindynaaminen muistinvaraustaiautomaattinen muistinvaraus,jossa muisti varataan tarpeen mukaanajon aikana.
Historia
Staattiset muuttujat ovat vähintään ALGOL 60 (1960), jolloin ne tunnetaan omina muuttujina :
Ilmoitus voidaan merkitä omalla lisäilmoittajalla . Tällä on seuraava vaikutus: kun palaat takaisin lohkoon, omien määrien arvot pysyvät muuttumattomina viimeisen poistumisen arvoista, kun taas ilmoitettujen muuttujien arvot, joita ei ole merkitty omalla, ovat määrittelemättömiä.
- Tarkistettu raportti ALGOL 60: sta, kohta "5. Ilmoitukset", s. 14
Tämä määritelmä eroaa hienovaraisesti staattisesta muuttujasta: se määrittelee vain käyttäytymisen ja siten käyttöiän, ei tallennustilaa: oma muuttuja voidaan varata, kun esimerkiksi funktio kutsutaan ensimmäisen kerran, eikä ohjelman latausaikana.
Sanan staattinen käyttö viittaamaan näihin muuttujiin on peräisin ainakin BCPL: stä (1966), ja sitä on suositellut C -ohjelmointikieli , johon BCPL vaikutti voimakkaasti. BCPL -määritelmä kuuluu seuraavasti:
(1) Staattiset tietoerät:
ne tietoerät, joiden laajuus kestää niin kauan kuin ohjelman suoritusaika; tällaisilla tietokohteilla on ilmeiset vakioarvot. Jokaisen staattisen tietoalueen on oltava ilmoitettu joko funktiona tai rutiinimäärityksenä, yleisenä ilmoituksena tai kaksoispisteen asettamana tarrana.- BCPL -viitekäsikirja, 7.2 Tilavaraus ja tietokohteiden laajuus
Huomaa, että BCPL määritteli "dynaamisen tietoalueen" niin kutsutulle automaattiselle muuttujalle (paikallinen, pino-allokoitu), ei kasanvaraisille kohteille, mikä on termin dynaaminen varaus nykyinen käyttö .
staticAvainsanaa käytetään C ja sukulaiskieliä sekä staattiset muuttujat ja muita käsitteitä.
Osoittaminen
Absoluuttinen osoite osoitemoodilla voidaan käyttää vain staattinen muuttujia, koska ne ovat vain erilaisia muuttujia, joiden sijainti tunnetaan kääntäjä käännöksen yhteydessä. Kun ohjelma (suoritettava tai kirjasto) ladataan muistiin, staattiset muuttujat tallennetaan ohjelman osoitetilan datasegmenttiin (jos se on alustettu) tai BSS -segmenttiin (jos ei ole alustettu ), ja ne tallennetaan vastaaviin osioihin objektitiedostoja ennen lataamiseen.
Soveltamisala
Suhteen ja laajuuden , staattinen muuttujilla on määrin koko ajon ohjelman, mutta voi olla enemmän rajoitettu laajuus . Perusero on staattinen globaali muuttuja , jolla on maailmanlaajuinen laajuus ja joka on siten kontekstissa koko ohjelman ajan, ja staattinen paikallinen muuttuja , jolla on paikallinen laajuus. Staattinen paikallinen muuttuja on erilainen kuin paikallinen muuttuja, koska staattinen paikallinen muuttuja alustetaan vain kerran riippumatta siitä, kuinka monta kertaa funktiota, jossa se sijaitsee, kutsutaan ja sen arvo säilytetään ja se on käytettävissä monilla kutsuilla funktiolle, jossa se on ilmoitettu , esim. käytettäväksi laskentamuuttujana. Staattinen muuttuja voi myös olla moduulin laajuus tai jotain sen muunnelmaa, kuten sisäinen kytkentä on C , joka on muodoltaan tiedosto laajuus tai moduulin laajuus.
Esimerkki
Esimerkki staattisesta paikallisesta muuttujasta C: ssä:
#include <stdio.h>
void Func() {
static int x = 0;
// |x| is initialized only once across five calls of |Func| and the variable
// will get incremented five times after these calls. The final value of |x|
// will be 5.
x++;
printf("%d\n", x); // outputs the value of |x|
}
int main() {
Func(); // prints 1
Func(); // prints 2
Func(); // prints 3
Func(); // prints 4
Func(); // prints 5
return 0;
}
Olio-ohjelmointi
In olio-ohjelmointi , on myös käsite staattinen jäsen muuttuja , joka on " luokka muuttuja " staattisesti määritelty luokka, eli sellainen jäsen muuttuja tietyn luokan, joka on jaettu kaikkien tapauksissa (esineet), ja on käytettävissä näiden objektien jäsenmuuttujana. Dynaamisesti määritellyn luokan luokkamuuttuja kielillä, joilla luokat voidaan määrittää ajon aikana, varataan, kun luokka on määritetty eikä ole staattinen.
Käännösaikana tunnetut objektivakiot , kuten merkkijonot , allokoidaan yleensä staattisesti. Objektipohjaisessa ohjelmoinnissa luokkien virtuaaliset menetelmätaulukot on yleensä allokoitu staattisesti. Staattisesti määritelty arvo voi myös olla globaali laajuudeltaan ja varmistaa, että samaa muuttumatonta arvoa käytetään koko ajon ajan johdonmukaisuuden varmistamiseksi.
Katso myös
Huomautuksia
Viitteet
- Kernighan, Brian W .; Ritchie, Dennis M. (1988). C -ohjelmointikieli (2. painos). Upper Saddle River, NJ: Prentice Hall PTR. ISBN 0-13-110362-8.
- Bjarne Stroustrupin C ++ -ohjelmointikieli (erikoispainos)(Addison Wesley, 2000; ISBN 0-201-70073-5 )