014
21.08.2009, 18:29 Uhr
~David_pb
Gast
|
Zitat: |
Es nützt ihm aber nichts. Wir reden doch von Garage::parkeAuto(), richtig?
Wenn der Compiler hier optimiert und eine Copy-Elimination von Auto a macht, dann gelangt das Original-Auto-Objekt in die parke()-Methode hinein, keine Kopie. parke() ruft dann a.printModell(), was (potentiell) das Objekt verändern kann, weil printModell nicht mit const attributiert ist.
Da der Kopf von parke() aber verspricht, dass das äußere Objekt ("Audi A5") by-value übergeben wird, darf es sich nicht ändern.
Der Compiler muss also (wenn er schon unbedingt den Funktionsaufruf optimieren will) spätestens bei printModell das Auto kopieren, sonst riskiert er, einen Fehler zu machen. Ist also Jacke wie Hose.
|
Du hast das Prinzip anscheinend noch nicht verstanden. Ein rvalue ist an kein benanntes Objekt gebunden, das heißt es existieren keine weiteren Referenzen auf dieses Objekt und genau deswegen darf ja optimiert werden. Der Compiler kann (und wird) in _diesem_ Fall optimieren:
C++: |
g.parkeAuto(Auto("Audi A5")); // <- hier kann optimiert werden Auto foo( "Audi A5" ); g.parkeAuto( foo ); // <- hier nicht
|
Zitat: |
Schön und gut, aber was der Compiler optimieren kann, ist für den Sprachstandard eher unerheblich. Relevant ist hier, dass temporäre Objekte nur an nicht-volatile, konstante Referenzen gebunden werden können - nachzulesen (etwas versteckt) im Standard unter 8.5.3 (5). Etwas versteckt deshalb, weil es unter "Ansonsten" steht und auch für ein paar andere Fälle gilt. Zum Beispiel ist [...]
|
Das ist zwar alles richtig, aber was hat das mit der aktuellen Diskussion zu tun? Im Moment geht es doch darum, dass pass by value auch für komplexe Objekte nicht immer teuer sein muss, wie viele anscheinend glauben. |