30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

364 12. Operator Overload<strong>in</strong>g<br />

zu weit, solche Systeme e<strong>in</strong>er genaueren Analyse zu unterziehen, e<strong>in</strong>es ist allerd<strong>in</strong>gs<br />

offensichtlich: Objekte, auf die man oft zugreift, müssen im schnellen<br />

Speicher zu liegen kommen. Objekte, deren Zustand erhalten bleiben muss,<br />

müssen wohl oder übel im nicht flüchtigen, dafür aber langsamen Speicher zu<br />

liegen kommen. Daneben gibt es noch die typischen Hybridobjekte, auf die<br />

e<strong>in</strong>erseits oft zugegriffen wird, die andererseits aber trotzdem nicht flüchtig<br />

se<strong>in</strong> dürfen. Diese lassen wir im Augenblick außer Acht, werden aber später<br />

noch e<strong>in</strong>mal darauf zurückkommen.<br />

Was wollen wir also erreichen? Der Aufruf von new soll den Speicherblock<br />

für das entsprechende Objekt automatisch entweder im schnellen oder<br />

im langsamen Teil des Speichers ablegen, je nachdem wie es die Natur des<br />

Objekts verlangt. Damit e<strong>in</strong>e Klasse kundtun kann, <strong>in</strong> welchem Teil des Speichers<br />

sie zu liegen kommen will, schreiben wir zwei Basisklassen, von denen<br />

entsprechend abgeleitet werden muss: E<strong>in</strong>e Klasse FastAccessibleObject<br />

und e<strong>in</strong>e Klasse NonVolatileObject. Je nachdem, von welcher Klasse abgeleitet<br />

wird, kommt e<strong>in</strong> Objekt bei se<strong>in</strong>er dynamischen Erzeugung im e<strong>in</strong>en<br />

oder anderen Teil des Speichers zu liegen. Bevor das Ganze nun zu theoretisch<br />

wird, sehen wir uns das am besten gleich an e<strong>in</strong>em ersten kle<strong>in</strong>en<br />

Beispiel an (first_new_delete_overload<strong>in</strong>g_demo.cpp).<br />

In diesem Beispiel ist zur Demonstration e<strong>in</strong>e Klasse MemoryProvider<br />

implementiert, die nur als Platzhalter für e<strong>in</strong>e “richtige” Speicherverwaltung<br />

dient, die <strong>in</strong> solchen Systemen gebraucht wird. Diese Klasse sieht folgendermaßen<br />

aus:<br />

23 class MemoryProvider<br />

24 {<br />

25 private :<br />

26 MemoryProvider ( ) ; // f o r b i d i n s t a n t i a t i o n<br />

27 public :<br />

28 static const u<strong>in</strong>t32 FAST = 0x01 ;<br />

29 static const u<strong>in</strong>t32 NON VOLATILE = 0 x02 ;<br />

30<br />

31 static void ∗ allocMemBlock ( u<strong>in</strong>t32 mem type , s i z e t s i z e )<br />

32 throw( b a d a l l o c ) ;<br />

33 static void freeMemBlock ( void ∗ base ptr )<br />

34 throw ( ) ;<br />

35 } ;<br />

Wie sich leicht erkennen lässt, kann man über diese Klasse die entsprechenden<br />

(un<strong>in</strong>itialisierten!) Speicherblöcke anfordern und nicht mehr benötigte<br />

Speicherblöcke wieder freigeben lassen. Beim Anfordern gibt man den Typ<br />

des benötigten Blocks sowie se<strong>in</strong>e Größe <strong>in</strong> Bytes an und bekommt e<strong>in</strong>en<br />

entsprechenden Base-Po<strong>in</strong>ter geliefert. Beim Freigeben übergibt man e<strong>in</strong>fach<br />

den Base-Po<strong>in</strong>ter. Die Implementation der Methoden liest sich so:<br />

182 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

183 /∗ This i s j u s t a dummy implementation f o r demo purposes . . .<br />

184 ∗/<br />

185 void ∗ MemoryProvider : : allocMemBlock ( u<strong>in</strong>t32 mem type , s i z e t s i z e )<br />

186 throw( b a d a l l o c )

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!