brug af Variableredit
synlighed og levetid for Variablerdit
variabler kan have forskellig synlighed eller omfang, alt efter hvordan de deklareres og anvendes. Scope refererer til evnen til at få adgang til indholdet af en bestemt variabel på et bestemt tidspunkt i programmet.
normalt bestemmes en variabels omfang af dens omsluttende blok. En blok kan vedlægges eksplicit på nogle sprog (begin/end, {/} par), mens blokken i andre er implicit.
næsten alle sprog har et samlet afgrænsningsområde, og hvis et program erklærer en variabel i dette omfang, er det kendt som en global variabel.
en lokal variabel er derimod en, der kun er synlig eller “i omfang” inden for dens blok.
overvej denne kode:
integer globalVariableglobalVariable = 5begin integer localVariable localVariable = 7 globalVariable = 8endlocalVariable = 3 /* <-- this is a syntax error */
den globale variabel er erklæret uden for en blok, så det er i det (implicitte) globale omfang, hvilket gør det til en global variabel. den lokale variabel erklæres i start/slut-blokken, hvilket begrænser dens omfang til den blok.
variabel globalvariabel starter som 5, tildeles 8 i blokken og afslutter som 8. Variabel localVariable tildeles 7, går derefter uden for anvendelsesområdet, før den ulovligt tildeles 3. Der er ingen variabel lokalvariabel på dette niveau.
en variabels levetid fortæller dig, hvornår variablen er aktiv. I det foregående eksempel oprettes en global variabel i starten af programmet og har en levetid svarende til programmets længde. For localVariable oprettes den først lige efter, at blokken begynder direktivet. Dens liv er forbi, når programmet passerer slutdirektivet.
dynamisk hukommelsesallokeringredit
mange programmer har meget specifikke formål og har brug for meget specifikke og små områder til hukommelse. Hvis vi skrev et program til læsning af billedfiler, er vi ikke sikre på, hvor store billederne kunne være. Nogle kan være hundredvis af megabyte, mens nogle kan være kilobyte eller mindre. Tildeling af hundredvis af megabyte, der ikke er nødvendige, ville gøre programmet vanskeligt at køre på nogle computere, mens tildeling af for lidt hukommelse ville betyde, at der er nogle billeder, vi ikke kan håndtere.
en god tilgang til dette problem er at tildele hukommelse efter behov. Dette kaldes dynamisk hukommelsesallokering. Vi beder simpelthen om så meget, som vi har brug for, mens programmet kører (snarere end på kompileringstidspunktet), ikke mere og ikke mindre. I vores eksempel vil dette lade os redigere både store og små billedfiler på en effektiv og effektiv måde. Der er nogle ekstra kompleksitet, da det ikke længere er det sprog, der beskæftiger sig med detaljerne i tildeling, men os direkte. I vores eksempel, hvis vi kører på en lavere endecomputer, er der muligvis ikke nok hukommelse til at rumme store billedfiler, så vi er nødt til at opdage (og muligvis yndefuldt mislykkes) i sådanne situationer.
dynamisk hukommelsesallokering er en hovedkilde til” hukommelseslækager”, hvor programmer allokerer, bruger og derefter udføres med et hukommelsesområde, men undlader at markere det som tilgængeligt igen. Disse problemer kan være svært at opspore, da i modsætning til andre fejl, lækager er ikke umiddelbart synlige.
nogle moderne sprog har indbyggede mekanismer til at forsøge at forhindre hukommelseslækager, kendt som affaldssamling. Dette system holder styr på, hvad tildeling bruges, hvor, når det er uden for rækkevidde. Affaldssamling har en lille præstationsstraf, men det betragtes nu almindeligvis som fremskridt. Java og Python har for eksempel en affaldssamler.