Site Overlay

Stakbaseret hukommelsesallokering

da dataene tilføjes og fjernes på en sidste-i-første-ud måde, er stakbaseret hukommelsesallokering meget enkel og typisk meget hurtigere end heapbaseret hukommelsesallokering (også kendt som dynamisk hukommelsesallokering), der typisk tildeles via malloc. En anden funktion er, at hukommelsen på stakken automatisk og meget effektivt genvindes, når funktionen går ud, hvilket kan være praktisk for programmereren, hvis dataene ikke længere er påkrævet., (Det samme gælder for longjmp, hvis det flyttede til et punkt før opkaldet til alloca skete.) Hvis dataene dog skal opbevares i en eller anden form, skal de kopieres fra stakken til bunken, før funktionen går ud. Derfor er stakbaseret allokering egnet til midlertidige data eller data, som ikke længere er påkrævet, efter at den aktuelle funktion udløber.

en tråds tildelte stakstørrelse kan være så lille som kun et par byte på nogle små CPU ‘ er. Tildeling af mere hukommelse på stakken end tilgængelig kan resultere i et nedbrud på grund af stack overflo.., Dette er også grunden til, at funktioner, der bruger alloca er normalt forhindret i at være inlined: bør en sådan funktion være inlined ind i en løkke, ville der ringer lider af en uventet vækst i stakken skik, at lave en overflow-meget mere sandsynligt.stakbaseret tildeling kan også forårsage mindre ydelsesproblemer: det fører til stakrammer i variabel størrelse, så både stack-og rammepegere skal styres (med stakrammer i fast størrelse er en af disse overflødig)., Dette er normalt meget billigere end at ringe allokere og gratis alligevel. I særdeleshed, hvis den nuværende funktion indeholder både opkald til alloca og blokke, der indeholder varierende længde lokale data, så der opstår en konflikt mellem alloca ‘ s forsøg på at øge den nuværende stack frame, indtil den nuværende funktion lukker versus compileren er nødt til at placere lokale variabler af variabel længde i den samme placering i stack frame., Denne konflikt løses typisk ved at oprette en separat kæde af heaplagring for hvert opkald til alloca (se: https://code.woboq.org/gcc/libiberty/alloca.c.html). Kæden registrerer stak dybde, hvori hver tildeling sker, efterfølgende opkald til alloca i enhver funktion trim denne kæde ned til den nuværende stak dybde til sidst (men ikke det samme) gratis opbevaring på denne kæde. Et opkald til alloca med et argument på nul kan også bruges til at udløse frigørelse af hukommelse uden at tildele mere sådan hukommelse., Som en konsekvens af denne konflikt mellem alloca og lokal variabel opbevaring er det måske ikke mere effektivt at bruge alloca end at bruge malloc.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *