Pointer oder Referenzen?

Pointer oder Referenzen? Das war die Frage und die Antwort ist – zumindest für mich – mein 90%-Entscheidungsbaum.

Video

Erklärung

Die Grundfrage, die ich mir immer stelle: ist der Parameter ein Basisdatentyp? Die sind nämlich so klein, dass sich ein Call-by-Reference nicht lohnt, weil Referenzen im Hintergrund als Pointer realisiert werden und damit meist mehr Platz auf dem Stack wegenehmen, als ein Call-by-Value direkt.

Bei Objekten gibt es noch ein paar andere Fragen: wenn das Objekt nur ein Parameter ist und nicht gespeichert werden soll, dann übergebe ich typischerweise eine konstante Referenz. Der Gedankengang hier ist, dass ich damit nur einen Pointer auf dem Stack habe und keine komplette Kopie anlege. In der entsprechenden Methode benutzt sich so eine Referenz für alle praktischen Belange wie ein Call-by-Value (bis auf dass keine Änderungen am Objekt möglich ist. Auf das Ändern von Parametern verzichte ich aber generell.), spart aber die Kopie, die dafür notwendig wäre.

Wenn ich das Objekt hingegen speichern möchte, dann stellt sich noch die Frage, ob es exklusiv meins sein soll oder nicht. Ist das der Fall, dann speichere ich gern eine Kopie, die mir niemand auch nur versehentlich von außen ändern kann. Dafür übergebe ich eine konstante Referenz, die als Quelle zum Kopieren taugt. Die eigentliche Kopie wird dann typischerweise in der Methode angelegt. Damit spare ich mir einmal das Kopieren, welches bei einem Call-by-Value notwendig wäre. Darf ich das Objekt hingegen nicht einfach so kopieren, dann nutze ich, wo immer möglich, std::shared_ptr<T>. Dadurch passt der Compiler für mich auf die Ressourcen auf und ich kann nicht irgendwo ein delete vergessen oder zu früh ausführen.

Sonderfälle, wie nicht-konstante Referenzen, tatsächlich mal ein Raw-Pointer etc. gibt es natürlich immer. Die stecken dann in den restlichen 10%, über die ich gesondert nachdenke.