Hallo Sheel,
Die Nachteile der Zeiger die ich erwähnt habe beziehen sich nicht auf die Unfähigkeit der Verwender sondern auf die Tatsache, dass Programmierer Menschen sind und daher Fehler am laufenden Band erzeugen. C++ bietet dir Möglichkeiten, dass du dich nicht mehr darum kümmern musst und daher auch keine Fehler mehr in dem Bereich machen kannst. Es gibt keine Grund weiterhin ein unsicheres und gefährliches Konzept zu verwenden wenn man eine sichere Alternative hat.
Bezüglich by value und by reference gibt es verschiedene Dinge:
1. By reference hat erstmal überhaupt rein gar nichts mit einem Zeiger zu tun.
C++:
void foo(ComplexType& t) {
}
void foo(ComplexType* t) {
}
Beides ist by reference, die erste Variante kommt jedoch ohne Zeiger aus. Es gibt also auch für Übergaben by reference keinen ersichtlichen Grund einen Zeiger zu verwenden.
2. Diese ganze Performancesache bezieht sich auf eine theoretische Umgebung. In der Realität hast du move-Semantics, Optimierer und viele weitere nette Dinge modifizieren dein Code gerade bei Valueübergaben so extrem, dass du den nicht mehr wiedererkennen würdest.
C++:
void foo(ComplexType t) {
int a = t.a;
int b = t.b;
int c = t.calculate(a * 2, b);
someOtherFunction(c);
}
Angenommen calculate sei const, dann optimiert der Optimierer t komplett weg und legt vor dem Funktionsaufruf die Adresse des Parameters in ein Register mit welchem foo dann arbeitet. Egal wie gross der Kopieraufwand für ComplexType ist, er wird da nie aufgerufen, genau so wenig wie der Destruktor.
Wenn es darum geht, dass sich jemand Gedanken darüber macht, dass die Übergabe eines shared_ptr ein Performanceproblem ist weil da by value übergeben wird und daher lieber darauf verzichten und raw Pointer verwenden optimieren völlig an der Realität vorbei. Es gibt dafür den bekannten Audruck: Mikrooptimierung. Es ist vergleichbar damit, dass du die Stabilität deines Gebäudes verbessern willst und mal damit beginnst alle Schrauben eine Umdrehung mehr anzuziehen während an diversen Stellen das Gebäude noch nicht mal richtig im Fundament verankert ist. Das Resultat ist, dass du überhaupt keinen Unterschied merkst.
Grüsse
Cromon