Allocator (C++)

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken
Alexander Stepanov, de persoon die de invoering van allocatoren binnen C++ sterk heeft bevorderd.

In C++ programmering zijn allocatoren (Engels: allocators) een belangrijk onderdeel van de C++ Standaardbibliotheek. Deze softwarebibliotheek biedt een aantal gegevensstructuren, zoals lijsten en verzamelingen, meestal aangeduid als containers. Tijdens uitvoering van het programma kunnen deze containers hun grootte aanpassen. Daartoe is doorgaans een vorm van dynamische geheugentoewijzing vereist. Allocatoren behandelen alle aanvragen voor het toewijzen en het vrijmaken van geheugen voor een container. Voor algemene doeleinden biedt de C++ Standaardbibliotheek allocatoren die standaard worden gebruikt. Programmeurs kunnen desgewenst ook op maat gemaakte allocatoren definiëren en bouwen.

Het idee van allocatoren werden uitgewerkt door Alexander Stepanov als onderdeel van de Standard Template Library (STL). Allocatoren waren oorspronkelijk bedacht als een middel om deze bibliotheek flexibel en onafhankelijk van het onderliggende geheugenmodel te maken. Zij moesten programmeurs in staat stellen op binnen de STL op maat gemaakte pointer- en referentietypen te gebruiken. In het beslissingsproces hoe STL binnen de C++ standaard moest worden ingepast, realiseerde de C++-standaardisatiecommissie zich echter dat een volledige abstractie van het geheugenmodel tot een onaanvaardbaar verlies aan performance zou leiden. Om dit te verhelpen werden er restrictievere eisen aan allocatoren gesteld. Als gevolg daarvan werd de mate van aanpasbaarheid van allocatoren binnen C++ een stuk beperkter dan wat Stepanov oorspronkelijk voor ogen had gestaan.

Toch zijn er tal van scenario's denkbaar waarin het gebruik van op maat gedefinieerde allocatoren wenselijk is. Enkele van de meest voorkomende redenen voor het definiëren van op maat gedefinieerde allocatoren zijn onder meer het verbeteren van de performance door gebruik te maken van geheugenpools en het inkapselen van de toegang tot verschillende soorten geheugen, zoals gedeeld geheugen of garbage collectiongeheugen. In het bijzonder kunnen programma's waar op zeer frequente basis van kleine hoeveelheden geheugen worden gealloceerd en weer vrijgegeven veel baat hebben bij op maat gedefinieerde allocatoren, zowel in termen van de looptijd van het programma (runtime) als ook wat betreft haar "geheugenfootprint".

Achtergrond[bewerken]

Nuvola single chevron right.svg Standard Template Library

In maart 1984 presenteerden Alexander Stepanov en Meng Lee de Standard Template Library aan het C++ standaard commité.[1] De bibliotheek kreeg een voorlopige goedkeuring, hoewel er wel een aantal kwesties aan de orde werden gesteld. In het bijzonder werd Stepanov gevraagd om de bibliotheek containers onafhankelijk van het onderliggende geheugenmodel te implementeren. [2] Dit leidde tot de creatie van allocatoren. Bijgevolg moesten alle STL-container interfaces worden herschreven om deze allocatoren te accepteren.

In het aanpassen van STL om te worden opgenomen in de C++ Standaard Bibliotheek werkte Stepanov nauw samen met verschillende leden van het standaard commité, daaronder Andrew Koenig en Bjarne Stroustrup. Zij observeerden dat maatwerkallocatoren mogelijk zouden kunnen worden gebruikt om persistente opslag van STL containers te implementeren, wat Stepanov op dat moment als een "belangrijk en interessant inzicht" beschouwde. [2]

Vanuit het oogpunt van portabiliteit zijn alle machine-specifieke zaken, die betrekking hebben op de notie van adressen, pointers, en ga zo maar door, in een klein, goed begrepen mechanisme ingekapseld. -Alex Stepanov, de ontwerper van de Standard Template Library

Het oorspronkelijke allocatorvoorstel behelste ook een aantal taalfuncties, die nog niet door het commité waren aangenomen, namelijk de mogelijkheid om template argumenten te gebruiken, die zelf templates waren. Aangezien deze functies niet door enige bestaande compiler kon worden gecompileerd, was er volgens Stepanov, "een enorme vraag naar Bjarne Stroustrups en Andy Koenigs tijd om te proberen te verifiëren dat wij deze niet-geïmplementeerde features wel correct gebruikten." [2] Waar de bibliotheek eerder direct gebruikt had gemaakt van pointers en referentietypen, zou het nu alleen nog aan de typen refereren die door de allocatoren werden gedefinieerd. Stepanov beschreef allocatoren als volgt: "Een leuke feature van STL is dat de enige plek waar de machine-gerelateerde typen (...) genoemd worden in ongeveer 16 regels code is ingekapseld." [2]

Hoewel Stepanov allocatoren oorspronkelijk bedoeld had om het onderliggende geheugenmodel volledig in te kapselen, realiseerde de standaardcommissie zich dat deze aanpak tot een onaanvaardbare degradatie van de efficiency zou leiden. Om dit probleem te verhelpen werd er een extra formulering aan de allocatoreisen toegevoegd. In het bijzonder mogen containerimplementaties ervan uitgaan dat de type definities (typedefs) van de allocator voor pointers en verwante integrale typen gelijkwaardig zijn aan die waar de standaard allocator in voorziet. Ook moeten alle instanties van een bepaald allocatortype altijd gelijk vergelijken.[3] Dit is effectief in tegenspraak met de oorspronkelijke ontwerpdoelen voor allocatoren.

Stepanov schreef later dat hoewel allocatoren "in theorie niet zo'n slecht idee zijn (...) zij jammer genoeg in de praktijk niet kunnen werken". Hij beweert dat om allocatoren echt nuttig te maken een wijziging in de kerntaal met betrekking tot referenties nodig was.[4]

Voetnoten[bewerken]

  1. Stepanov, Alexander; Meng Lee. The Standard Template Library. Presentation to the C++ standards committee. Hewlett Packard Libraries (7 March 1994)
  2. a b c d Stevens, Al. Al Stevens Interviews Alex Stepanov. Dr Dobb's Journal (1995)
  3. ISO/IEC (2003). ISO/IEC 14882:2003 (E): Programming Languages - C++ § 20.1.5 Allocator requirements [lib.allocator.requirements] par. 4
  4. Lo Russo, Graziano. An Interview with A. Stepanov. www.stlport.org (1997) Geraadpleegd op 13 May 2009

Externe links[bewerken]