Site Overlay

Stack – baserad minnesallokering

eftersom data läggs till och tas bort på ett sista-i-första-ut sätt, stack-baserade minnesallokering är mycket enkel och typiskt mycket snabbare än heap-baserade minnesallokering (även känd som dynamisk minnesallokering) typiskt allokeras via malloc. En annan funktion är att minnet på stapeln automatiskt och mycket effektivt återvinns när funktionen avslutas, vilket kan vara bekvämt för programmeraren om data inte längre behövs., (Detsamma gäller för longjmp om det flyttade till en punkt innan samtalet till alloca hände.) Om data måste lagras i någon form måste den kopieras från stapeln till högen innan funktionen går ut. Därför är stackbaserad tilldelning lämplig för tillfälliga data eller data som inte längre krävs efter att den aktuella funktionen har avslutats.

en tråds tilldelade stackstorlek kan vara så liten som bara några byte på några små processorer. Att fördela mer minne på stapeln än vad som är tillgängligt kan resultera i en krasch på grund av stackflödet., Det är också anledningen till att funktioner som använder alloca vanligtvis hindras från att vara inlinjeformade: om en sådan funktion skulle vara inlinjeformad i en slinga skulle den som ringer drabbas av en oförutsedd tillväxt i stackanvändning, vilket gör ett överflöde mycket mer sannolikt.

Stackbaserad tilldelning kan också orsaka mindre prestandaproblem: det leder till stackramar med varierande storlek, så att både stack-och ramspekare måste hanteras (med stapelramar med fast storlek är en av dessa överflödiga)., Detta är oftast mycket billigare än att ringamalloc ochgratis ändå. I synnerhet om den aktuella funktionen innehåller både anrop till alloca och block som innehåller lokal data med variabel längd, uppstår en konflikt mellan alloca: s försök att öka den aktuella stapelramen tills den aktuella funktionen avslutas jämfört med kompilatorns behov av att placera lokala variabler med variabel längd på samma plats i stapelramen., Denna konflikt löses vanligtvis genom att skapa en separat kedja av heap-lagring för varje anrop till alloca (se: https://code.woboq.org/gcc/libiberty/alloca.c.html). Kedjan registrerar stapeldjupet vid vilket varje tilldelning sker, efterföljande anrop till alloca i någon funktion trimma denna kedja ner till det aktuella stapeldjupet för att så småningom (men inte omedelbart) frigöra någon lagring på denna kedja. Ett samtal till alloca med ett argument på noll kan också användas för att utlösa minnesfriheten utan att allokera något mer sådant minne., Som en följd av denna konflikt mellan alloca och lokal variabel lagring kan det vara effektivare att använda alloca än att använda malloc.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *