Site Overlay

Stack-basert memory allocation

Fordi dataene er lagt til og fjernet i en siste-in-first-out måte, stack-basert minne tildeling er veldig enkel og vanligvis mye raskere enn heap-basert minne fordeling (også kjent som dynamic memory allocation) vanligvis tildelt via malloc. En annen funksjon er at minnet på stakken er automatisk, og veldig effektivt, gjenvunnet når funksjonen kommer ut, som kan være praktisk for programmereren hvis dataene ikke lenger er nødvendige., (Det samme gjelder for longjmp hvis det flyttet til et punkt før samtalen til alloca som skjedde.) Men hvis data trenger å bli holdt i noen form, så det må ikke kopieres fra bunken til haugen før funksjonen kommer ut. Derfor, stack-basert fordeling er egnet for midlertidige data eller data som ikke lenger er nødvendig etter den aktuelle funksjonen kommer ut.

En tråd er tildelt stack størrelse kan være så liten som bare et par byte på noen små Cpuer. Å tildele mer minne på stakken enn det som er tilgjengelig kan resultere i en krasj på grunn av stack overflow., Dette er også grunnen til at funksjoner som bruker alloca er vanligvis forhindret fra å være inlined: bør en slik funksjon være inlined inn i en loop, vil den som ringer vil lide av en uventet vekst i stabel bruk, noe som gjør et overløp mye mer sannsynlig.

Stack-basert fordeling kan også føre til mindre problemer med ytelsen: det fører til variabel størrelse stabelen rammer, slik at både stabel og ramme pekere må være klart (med fast størrelse bunke bilder, ett av disse er overflødige)., Dette er vanligvis mye billigere enn å ringe malloc og gratis uansett. Særlig hvis den aktuelle funksjonen inneholder både samtaler til alloca og blokker som inneholder variabel lengde lokale data da det oppstår en konflikt mellom alloca forsøk på å øke den nåværende stabelen rammen til den aktuelle funksjonen kommer ut versus kompilatoren er nødvendig å plassere lokale variabler av variabel lengde på samme sted i bunken ramme., Denne konflikten er vanligvis løst ved å opprette en egen kjede av haugen lagring for hvert anrop til alloca (se: https://code.woboq.org/gcc/libiberty/alloca.c.html). Kjeden poster stabelen dybden der hver tildeling skjer, påfølgende anrop til alloca i hvilken som helst funksjon trim denne kjeden ned til gjeldende stabelen dybde til slutt (men ikke umiddelbart) gratis eventuell lagring på denne kjeden. Et anrop til alloca med et argument null kan også brukes til å utløse frigjøring av minne uten å tildele noen flere slike minne., Som en følge av denne konflikten mellom alloca og lokal variabel lagring, bruk alloca kan ikke være mer effektivt enn å bruke malloc.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *