006
29.09.2003, 19:51 Uhr
virtual
Sexiest Bit alive (Operator)
|
Mein Meinung dazu (falls sie jemanden interessiert): Es gibt hier keinen Königweg. Es sind meiner Meinung nach zwei wesentliche Aspekte zu beachten. 1. Speicherlayout Wird Ein Array statische deklariert, etwa so:
so liegen alle Elemente dieses Arrays in einem zusammenhängenden Speicherbereich. Wenn man das gleiche Array dynamisch haben will, darf man folglich nicht mehr als ein malloc Machen und man muß die Referenzierung der einzelnen Elemente per hand machen, weil malloc nun mal nur eindimensionale Arrays zurückgibt. 2. Ansprechen einzelnen Elemente Steht mehr im Vordergrund, eine bequeme Referenzierung der einzelnen Array elemente zu haben, dann wird man kaum umhinkommen, einen Ansatz zu wählen, wie ihn Pablo vorgeschalgen hat (Array als array von Speicherbereichen ansehen). Das kann durchaus sinnvoll sein.
Die Frage, was nun sinnvoll ist, hängt meiner Meinung nach von dem jeweiligen Problem ab, wenn ich nach einer pauschalen Meinung gefragt wäre, würde ich aber ein einfaches Malloc vorziehen, weil:
1. Elemente liegen in einem zusammenhängenden Speicherbereich, Operationen, die auf jedes Elemente unabh. von ihrer Lage in dem Array wirken, lassen sich also leichter Implementieren (nur eine Schleife an Stelle von zwei).
2. Erzeugen und Freigeben des Arrays ist deutlich einfacher als bei der unter 2 genannten Lösung.
3. Erzeugen und Freigeben des Arrays ist meßbar performanter als bei der unter 2 genannten Lösung, gleiches gilt für die Vergrößerung und verkleinerung des Arrays
4. Es ist weniger Speicherintensiv
Zwar sehe ich auch den Nachteil, daß es komplizierter ist, auf die einzelnen Elemente direkt zuzugreifen, aber das ist in meinen Augen noch verkraftbar (die von Beefy angeprochenen Heisenbugs können eigentlich nur dann auftreten, wenn man die Dimensionen vertauscht; eine Sache, die man auch bei einem Statischen 2D Array falsch machen kann.).
Wenn viele Arrays verschiedener Größe benutzt werden, empfiehlt sich eh, einen entsprechende Struktur mit passenden Accessorroutinen zu machen. Wiederverwendbarer Code sollte eben auch in C kein Fremdwort sein... -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |