Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

22.03.2009, 13:25

Zitat von »"K-Bal"«

Du könntest auch Pointer auf das Objekt speichern, das verursacht weniger Overhead.
Kommt drauf an, was man macht. Ich würde das wie bereits erwähnt erst in Erwägung ziehen, falls ich dort wirklich Probleme habe oder es einen anderen Grund für Zeiger gibt (z.B. Polymorphie). Aber einfach mal auf gut Glück zu optimieren ist nicht gerade der beste Ansatz. Und wenn schon, würde ich Smart Pointer speichern oder gleich Boost.Pointer Container verwenden. Denn selber freizugeben ist nicht wirklich praktisch.

Zeiger können im Gegenzug auch verlangsamend wirken. Erstens hat man beim Zugriff eine zusätzliche Indirektion, und bei linearen Containern wie std::vector oder std::deque muss jedes Element einzeln allokiert werden, was mehr Zeit braucht als eine Massen-Allokation.

Also lass es ruhig so, n0_0ne... ;)

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

12

22.03.2009, 17:26

OK, ich werds dann vorerst mal so lassen... aber deine letzte Anmerkung hab ich nicht verstanden:

Zitat

bei linearen Containern wie std::vector oder std::deque muss jedes Element einzeln allokiert werden, was mehr Zeit braucht als eine Massen-Allokation.

Soweit ich das verstanden habe, wird bei Vector intern eine größere Menge Speicher allokiert und dann so lange dort hineingespeichert, bis sie voll ist, dann wird ein größerer Platz allokiert und alles dort hineinkopiert... Also wird doch nicht alles einzeln allokiert? und was hat das überhaupt mit den gespeicherten Pointer zu tun? oder hab ich dich jetzt nicht richtig verstanden, und du meinst was ganz anderes?

13

22.03.2009, 18:00

Das gilt für die elemente des Containers. wenn das aber zeiger sind, werden ja die Objekte, auf die die zeiger verweisen, eins nach dem anderen allokiert.

14

22.03.2009, 19:06

Zitat von »"n0_0ne"«

Soweit ich das verstanden habe, wird bei Vector intern eine größere Menge Speicher allokiert und dann so lange dort hineingespeichert, bis sie voll ist, dann wird ein größerer Platz allokiert und alles dort hineinkopiert... Also wird doch nicht alles einzeln allokiert?
Ja, da hast du Recht. Ich bezog mich eben auf den Fall, in dem man als Element kein Objekt einer Klasse, sondern einen Zeiger speichert. Dieser bekommt dann per new einzeln Speicher für das eigentliche Objekt zugewiesen. Somit muss das für jedes Element getan werden, was einzeln langsamer ist, als wenn man einen grossen Speicherbereich auf einmal allokiert.

Gemeinsam angefordert wird in diesem Fall nur der Speicherbereich für die Zeiger. Wenn man von Overhead spricht, sollte man auch bedenken, dass Zeiger ebenfalls Speicherplatz brauchen und zu einer Indirektion führen.

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

15

22.03.2009, 20:07

Jo, ich hab mich bei Overhead eigentlich nur auf den Speicherverbrauch bezogen. Normalerweise ist der Speicherverbrauch eines Zeigers ja kleiner als der einer zusätzlichen Klasseninstanz.

16

22.03.2009, 20:37

Zitat von »"K-Bal"«

Normalerweise ist der Speicherverbrauch eines Zeigers ja kleiner als der einer zusätzlichen Klasseninstanz.
Aber die Klasseninstanz muss trotzdem erstellt werden, nur ist dann noch ein Zeiger dazwischen.

Das könnte höchstens bei einem std::vector etwas ausmachen, da der immer etwas vorallokiert. Aber wenn es um Speicherverbrauch geht, wäre eine andere Datenstruktur geeigneter.

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

17

22.03.2009, 20:48

Zitat von »"Nexus"«

Zitat von »"K-Bal"«

Normalerweise ist der Speicherverbrauch eines Zeigers ja kleiner als der einer zusätzlichen Klasseninstanz.
Aber die Klasseninstanz muss trotzdem erstellt werden, nur ist dann noch ein Zeiger dazwischen.

Das könnte höchstens bei einem std::vector etwas ausmachen, da der immer etwas vorallokiert. Aber wenn es um Speicherverbrauch geht, wäre eine andere Datenstruktur geeigneter.


Es geht ja darum, dass das Objekt beim speichern kopiert wird, also wird der doppelte Speicherplatz beansprucht. Wenn jetzt ein Zeiger doppelt vorhanden ist ist das nicht so tragisch, wie wenn ne riesige Klasse zwei mal vorhanden ist.

18

22.03.2009, 21:25

Zitat von »"K-Bal"«

Es geht ja darum, dass das Objekt beim speichern kopiert wird, also wird der doppelte Speicherplatz beansprucht. Wenn jetzt ein Zeiger doppelt vorhanden ist ist das nicht so tragisch, wie wenn ne riesige Klasse zwei mal vorhanden ist.
Das eine Objekt existiert nur temporär. Also geht es dir doch nicht um den Speicherplatz, sondern um den Aufwand beim Kopieren, richtig?

Dazu kann ich mich nur wiederholen. Darüber sollte man sich Gedanken machen, wenn man mittels Profiling festgestellt hat, dass an der Stelle wirklich ein Problem besteht. Wie angemerkt sind Zeiger nämlich auch nicht unbedingt die optimale Lösung. Jetzt mal ganz ausser Betracht gelassen, dass eine Compiler-Optimierung möglich ist (insbesondere wenn man ein unbenanntes RValue-Objekt übergibt).

Werbeanzeige