Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.iso-c++ > #1997
| From | ram@zedat.fu-berlin.de (Stefan Ram) |
|---|---|
| Newsgroups | de.comp.lang.iso-c++ |
| Subject | Re: Move semantics und operator overloading |
| Date | 2017-01-09 20:26 +0000 |
| Organization | Stefan Ram |
| Message-ID | <RVO-20170109212221@ram.dialup.fu-berlin.de> (permalink) |
| References | (2 earlier) <99988bba-1453-4e4a-bf29-a11886a5851e@googlegroups.com> <RVO-20170108145851@ram.dialup.fu-berlin.de> <30d04616-3615-44c7-a4aa-9f6a50d3b8af@googlegroups.com> <move-20170108232127@ram.dialup.fu-berlin.de> <8722e69a-16cc-4d7f-a3ee-baed2b66a56b@googlegroups.com> |
Helmut Zeisel <zei2011@liwest.at> writes: >a1 wird (nach dem std::cout) in die lokale Variable a kopiert, bei >der Rückgabe wird jedenfalls nichts kopiert, sondern statt >einer Kopie die RVO angewendet. Deine ursprüngliche Frage war wohl, warum »Four« weniger move/copy-Operationen macht als »Two«. Hier eine etwas erweiterte und manuell bearbeitete Ausgabe für den Fall »(a+b)+c«: *************************** Testing 1AI4FourE ### Constructing a 0x60 ### Constructing b 0x40 ### Constructing c 0x20 (a+b)+c const a& + const b&: Aufruf 0 ### Copying a 0x80 ... 0 ### Concatenating a + b 0x80 ... 1 ab&& + const c&: Aufruf 1 ### Concatenating ab + c 0x80 ... ### Moving abc 0x00 *************************** Testing 1AI3TwoE ### Constructing a 0x40 ### Constructing b 0x20 ### Constructing c 0x00 (a+b)+c ### Copying a 0x80 a + const b&: Aufruf 0 ### Concatenating a + b 0x80 ### Moving ab 0x60 ab + const c&: Aufruf 1 ### Concatenating ab + c 0x60 ### Moving abc 0xe0 Die Adresse ist der this-Zeiger des Objektes, das die Ausgabe erzeugt. In »(a+b)+c« ist »(a+b)« ein Temporär mit der Adresse 80. (Die Adressen wurden nicht manuell hinzugefügt, sondern stammen vom Programm.) Bei »Four« wird für die lokale Variable »a« aus Aufruf 0 gleich dieser Temporär genommen (RVO) und Aufruf 1 referenziert diesen Temporär und schreibt noch ein »c« dahinter. Hier war kein copy/move notwendig. Bei »Two« wird für den Parameter »a« ebenfalls gleich der Temporär genommen. Doch kommt für die Addition des »c« bei »Two« nur die Überladung mit dem Kopierparameter »a« in Frage. Dieser hat die Adresse 0x60 und da es ein Kopierparameter ist muß der Temporär 0x80 jetzt in die Adresse 0x60 gebracht werden - und dieser Schritt war bei »Four« nicht nötig, weil dort eine Überladung verwendet werden konnte, deren erster Parameter kein Kopierparameter ist.
Back to de.comp.lang.iso-c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-06 23:53 -0800
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-07 15:38 +0000
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-07 16:36 +0000
Re: Move semantics und operator overloading Helmut Zeisel <helmut.zeisel@gmail.com> - 2017-01-07 12:10 -0800
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-08 14:00 +0000
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-08 07:27 -0800
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-08 22:26 +0000
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-09 00:50 -0800
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-09 20:26 +0000
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-09 22:59 -0800
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-10 17:32 +0000
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-10 09:56 -0800
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-11 00:21 +0000
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-10 23:41 -0800
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-11 10:04 +0000
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-11 02:33 -0800
Re: Move semantics und operator overloading Bonita Montero <Bonita.Montero@gmail.com> - 2017-01-11 15:43 +0100
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-11 22:27 +0000
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-11 22:22 -0800
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-12 18:15 +0000
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-12 12:34 -0800
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-13 03:30 -0800
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-11 23:53 -0800
Re: Move semantics und operator overloading ram@zedat.fu-berlin.de (Stefan Ram) - 2017-01-12 20:23 +0000
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-13 00:47 -0800
Re: Move semantics und operator overloading Helmut Zeisel <zei2011@liwest.at> - 2017-01-11 00:15 -0800
csiph-web