Hallo moe,
Das heißt, wenn meine Objekte in einem Array liegen, gibt es
keinen Grund, mehr als einen Zeiger zu verwenden, wenn die
Objekte aber „einzeln“ sind, komme ich um einen Zeiger pro
Objekt nicht drumrum, richtig?
Im ersten Fall reserviert der Compiler schon einen Speicherblock in welchem Platz für z.B. 20 Cars Objekte ist. Da die Grösse eines Car-Objekts bekannt ist, kann man die Lage der einzelnen Objekte innerhalb des Speicherblocks problemlos berechnen.
Legst du aber z.B. die einzeln Car-Objekte und erst erst zur Laufzeit auf dem Heap an, also z.B. mit malloc() sind diese Speicherblöcke wild verteilt und du musst zu jedem Objekt einen eigenen Zeiger verwalten.
Ein weiterer Grund könnte auch sein, dass du eine Liste von Car-Objekten hast welche z.B. eine Medell-Liste darstellen und du möchtest daraus eine Bestell-Liste bilden. Mann könnte jetzt auch nur die Indexe der Einträge abspeichern, was aber weniger Effizient ist, wenn viele Zugriffe auf das selbe Objekt gemacht werden müssen.
Car \*Marke[20]
......
x = Marke[3].x;
y = Marke[3].y;
z = Marke[3].z;
.......
Car \*ptr = Marke[3];
x = ptr-\>x;
y = ptr-\>y;
z = ptr-\>z;
aus „Marke[3].x“ erzeugt der Compiler
&Marke + (3 * sizeof(Car)) + Offset(x);
Aus „ptr->x“ wird aber nur noch:
ptr + Offset(x);
Ohne Optimierung spart man also in obigem Baispiel 2 Multiplikationen ein, wodurch der Code schneller und kleiner wird.
MfG Peter(TOO)