30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

12.3 Speicherverwaltung 363<br />

er dort ke<strong>in</strong>e passende Umwandlung f<strong>in</strong>det, endet der Versuch der Übersetzung<br />

des obigen Statements <strong>in</strong> e<strong>in</strong>em Fehler. Es gibt auch zwei sehr gute<br />

Gründe für dieses Verhalten:<br />

1. Würde der Compiler Umwandlungsketten suchen (und f<strong>in</strong>den), so kann<br />

es leicht zu bösen Überraschungen bezüglich Ambiguitäten oder auch<br />

bezüglich Verträglichkeit von Datentypen kommen, die sich eigentlich<br />

beabsichtigterweise nicht vertragen sollten.<br />

2. Müsste der Compiler auf die Suche nach Umwandlungsketten gehen,<br />

dann würde ihn dies nicht wirklich performanter machen, denn dafür<br />

wäre die Implementation von e<strong>in</strong>igen sehr komplexen graphentheoretischen<br />

Algorithmen notwendig. Und die durch Umwandlungen aufgespannten<br />

Graphen können groß werden...<br />

12.3 Speicherverwaltung<br />

Waren schon selbstdef<strong>in</strong>ierte Typumwandlungs-Operatoren mit Vorsicht anzuwenden,<br />

so kommen wir jetzt zu e<strong>in</strong>em Thema, das wirklich als for Experts<br />

only ausgewiesen werden muss: Overload<strong>in</strong>g der new und delete<br />

Operatoren, um gewisse Teile der Speicherverwaltung selbst <strong>in</strong> die Hand zu<br />

nehmen. Im Pr<strong>in</strong>zip kann man damit sehr s<strong>in</strong>nvolle Konstrukte implementieren,<br />

aber die Möglichkeiten, ungeahnte Zeitbomben <strong>in</strong> die eigene Software<br />

e<strong>in</strong>zubauen, s<strong>in</strong>d auch nicht zu verachten! Man muss wirklich ganz genau wissen,<br />

was man tut, wenn man e<strong>in</strong> Overload<strong>in</strong>g von new und delete s<strong>in</strong>nvoll<br />

und robust e<strong>in</strong>setzen will!<br />

Genug gewarnt – wenden wir uns also nun wirklich den Grundpr<strong>in</strong>zipien<br />

e<strong>in</strong>er selbstgebastelten Speicherverwaltung zu.<br />

12.3.1 E<strong>in</strong>faches new und delete<br />

Bisher haben wir damit gelebt, dass bei e<strong>in</strong>em Aufruf von new e<strong>in</strong>fach h<strong>in</strong>ter<br />

den Kulissen genügend Speicher reserviert wurde und wir ke<strong>in</strong>en E<strong>in</strong>fluss darauf<br />

hatten, wo dieser Speicherblock hergenommen wird und wo er endgültig<br />

zu liegen kommt. In den allermeisten Fällen ist das auch vollkommen ausreichend.<br />

Stellen wir uns aber nun z.B. vor, dass wir es mit e<strong>in</strong>em System zu tun<br />

hätten, <strong>in</strong> dem gewisse Objekte <strong>in</strong> e<strong>in</strong>em besonderen Speicherbereich liegen<br />

müssen, um e<strong>in</strong>e saubere Funktionalität zu gewährleisten. In embedded Systems<br />

kann es schon e<strong>in</strong>mal vorkommen, dass man es mit zwei verschiedenen<br />

Arten von Speichern zu tun hat. Die e<strong>in</strong>e Art von Speicher gestattet e<strong>in</strong>en<br />

schnellen Zugriff, ist aber flüchtig. Die andere Art von Speicher ist langsam,<br />

dafür aber nicht flüchtig und gestattet daher das Speichern von Objekten, die<br />

auch nach dem “Ausschalten” des Systems erhalten bleiben. Es g<strong>in</strong>ge jetzt

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!