Site Overlay

Stack-based memory allocation

omdat de gegevens worden toegevoegd en verwijderd op een last-in-first-out manier, stack-based memory allocation is zeer eenvoudig en meestal veel sneller dan heap-based memory allocation (ook bekend als dynamic memory allocation) meestal toegewezen via malloc. Een andere functie is dat het geheugen op de stack automatisch en zeer efficiënt wordt teruggewonnen wanneer de functie wordt afgesloten, wat handig kan zijn voor de programmeur als de gegevens niet langer nodig zijn., (Hetzelfde geldt voor longjmp als het verplaatst is naar een punt voordat de aanroep naar alloca gebeurde.) Als de gegevens echter in een of andere vorm moeten worden bewaard, dan moet deze van de stapel naar de heap worden gekopieerd voordat de functie wordt afgesloten. Daarom is stack-gebaseerde toewijzing geschikt voor tijdelijke gegevens of gegevens die niet langer nodig zijn nadat de huidige functie wordt afgesloten.

De toegewezen stackgrootte van een thread kan zo klein zijn als slechts een paar bytes op sommige kleine CPU ‘ s. Het toewijzen van meer geheugen op de stack dan beschikbaar is kan resulteren in een crash als gevolg van stack overflow., Dit is ook de reden waarom functies die alloca gewoonlijk niet kunnen worden geïnlineerd: zou een dergelijke functie in een lus worden geïnlineerd, dan zou de beller lijden aan een onverwachte groei in stackgebruik, waardoor een overflow veel waarschijnlijker is.

stack-based allocatie kan ook kleine prestatieproblemen veroorzaken: het leidt tot stack frames met variabele grootte, zodat zowel stack als frame pointers moeten worden beheerd (bij stack frames met vaste grootte is een van deze overbodig)., Dit is meestal veel goedkoper dan het aanroepen van malloc en free hoe dan ook. In het bijzonder, als de huidige functie zowel aanroepen aan alloca als blokken bevat die lokale gegevens van variabele lengte bevatten, dan treedt er een conflict op tussen alloca ’s pogingen om het huidige stack frame te vergroten totdat de huidige functie stopt versus de compiler’ s behoefte om lokale variabelen van variabele lengte op dezelfde locatie in het stack frame te plaatsen., Dit conflict wordt meestal opgelost door een aparte keten van heapopslag aan te maken voor elke aanroep naar alloca (zie: https://code.woboq.org/gcc/libiberty/alloca.c.html). De keten registreert de stackdiepte waarop elke allocatie plaatsvindt, daaropvolgende aanroepen naar alloca in elke functie trimmen deze keten naar de huidige stackdiepte om uiteindelijk (maar niet onmiddellijk) elke opslag op deze keten vrij te maken. Een aanroep naar alloca met een argument van nul kan ook worden gebruikt om het vrijmaken van geheugen te activeren zonder nog meer van dat geheugen toe te wijzen., Als gevolg van dit conflict tussen alloca en lokale variabele opslag, kan het gebruik van alloca niet efficiënter zijn dan het gebruik van malloc.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *