Es hängt davon ab, was Sie mit "Kosten" und Eigenschaften der Host-System (Hardware, Betriebssystem) in Bezug auf Operationen.
Wenn Ihr Kostenmaß die Speichernutzung ist, dann ist die Berechnung der Kosten offensichtlich - summieren Sie die Größen von allem, was kopiert wird.
Wenn Ihr Maß ist Ausführungsgeschwindigkeit (oder "Effizienz"), dann ist das Spiel anders. Hardware (und Betriebssysteme und Compiler) neigen dazu, aufgrund von dedizierten Schaltungen (Maschinenregistern und wie sie verwendet werden) für das Ausführen von Operationen beim Kopieren von Dingen bestimmter Größen optimiert zu sein.
Es ist zum Beispiel üblich, dass eine Maschine eine Architektur (Maschinenregister, Speicherarchitektur usw.) hat, die zu einem "Sweet Spot" führt - das Kopieren von Variablen einer gewissen Größe ist am "effizientesten", aber das Kopieren ist größer ODER kleinere Variablen ist weniger so. Größere Variablen kosten mehr zum Kopieren, da möglicherweise mehrere Kopien kleinerer Blöcke erforderlich sind. Kleinere können auch mehr kosten, da der Compiler den kleineren Wert in eine größere Variable (oder ein größeres Register) kopieren, die Operationen darauf ausführen und den Wert dann zurückkopieren muss.
Beispiele mit Gleitkommazahl enthalten einige Cray Supercomputer, die nativ double precision floating point (aka double
in C++) und alle Operationen mit einfacher Genauigkeit (aka float
in C++) emuliert werden in der Software unterstützen. Einige ältere 32-Bit-x86-CPUs arbeiteten auch intern mit 32-Bit-Ganzzahlen, und Operationen mit 16-Bit-Ganzzahlen erforderten mehr Taktzyklen aufgrund der Übersetzung von/zu 32-Bit (dies trifft nicht für modernere 32-Bit- oder 64-Bit-Prozessoren zu). Bit-x86-Prozessoren, da sie das Kopieren von 16-Bit-Ganzzahlen zu/von 32-Bit-Registern ermöglichen und auf diesen mit weniger Strafen arbeiten.
Es ist ein Kinderspiel, dass das Kopieren einer sehr großen Struktur nach Wert weniger effizient ist als das Erstellen und Kopieren seiner Adresse. Aber aufgrund von Faktoren wie dem oben Gesagten ist der Überkreuzungspunkt zwischen "am besten etwas von dieser Größe nach Wert kopieren" und "am besten, um seine Adresse zu übergeben" weniger klar.
Zeiger und Referenzen neigen dazu, auf ähnliche Weise implementiert zu werden (z. B. kann ein Durchgang durch Referenz auf die gleiche Weise implementiert werden wie ein Zeiger), aber das ist nicht garantiert.
Der einzige Weg, um sicher zu sein, ist es zu messen. Und erkennen Sie, dass die Messungen zwischen den Systemen variieren.
Sie sollten es messen. Die Größe der Sache, die referenziert/kopiert wird, ist nicht die einzige Sache, die ins Spiel kommt. – juanchopanza
http://stackoverflow.com/questions/21605579/how-true-is-want-speed-pass-by-value –
Kurz gesagt: Es ist fast immer effizienter, native Typen (int, float, double) zu übergeben Wert als durch Referenz. Nicht nur, weil ein Zeiger in den meisten Fällen größer oder so groß wie der native Datentyp ist, sondern auch, weil es für den Optimierer viel schwieriger ist, Referenzparameter als Werteparameter zu optimieren. – MikeMB