Open Source im professionellen Einsatz

Move-Semantik

Die Standardcontainer erhalten außerdem zwei neue Methoden, die sich durch »&&« auszeichnen, so genannte Rvalue-Referenzen [4]. Diese Methoden, im Beispiel der Move-Konstruktor (Zeile 41) und das Move-Assignment (Zeile 43), statten den Datentyp mit Move-Semantik aus.

Ziel der Move-Semantik ist es, unnötiges Kopieren von Objekten zu vermeiden, denn die Move-Semantik transferiert beim Erzeugen von neuen Objekten die Inhalte aus bestehenden, während die Copy-Semantik diese kopiert.

Listing 2:
Move-Semantik

01 std::cout << "move semantic for vector: " << std::endl;
02 std::vector <int> vec1={1,2,3,4,5,6,7,8,9};
03 std::vector <int> vec2;
04 std::cout << "vec1.size(): " << vec1.size() <<  " vec2.size(): " << vec2.size() << std::endl;
05 vec2= std::move(vec1);
06 std::cout << "vec1.size(): " << vec1.size() <<  " vec2.size(): " << vec2.size() << "nn";
07 std::cout <<"copy semantic for vector: " << std::endl;
08 std::vector <int> vec3;
09 std::cout << "vec2.size(): " << vec2.size() <<  " vec3.size(): " << vec3.size() << std::endl;
10 vec3= vec2;
11 std::cout << "vec2.size(): " << vec2.size() <<  " vec3.size(): " << vec3.size() << std::endl;

Alles nur kopiert

Der Default-Konstruktor in Zeile 40 und der Default-Assignment-Operator in Zeile 42 setzen die Copy-Semantik um. Das Listing 2 soll die Unterschiede der Copy- und Move-Semantik verdeutlichen. Der Vektor »vec1« enthält zu Anfang die natürlichen Zahlen 1 bis 9, »vec2« hingegen ist leer. C++0x bildet den Aufruf der neuen Funktion »std::move« auf die Move-Assignment-Methode des Vektors ab, sodass dieser die Elemente von »vec1« übertragen bekommt (Abbildung 1). Im Gegensatz hierzu kopiert die Zuweisung »vec3= vec2« die Elemente des »vec2«, der seinerseits unverändert bleibt (Abbildung 2). Insbesondere beim Umgang mit großen Datenmengen bietet die Move-Semantik ein nicht zu unterschätzendes Optimimierungspotenzial, da sie jedes überflüssige Erzeugen und Kopieren von Daten vermeidet.

Erlaubt es die Move-Semantik, bei der Arbeit mit Containern an der Performance zu drehen, bringt C++0x zudem weitere Verbesserungen mit, die das Programmieren mit Containern der Standard Template Library (STL) deutlich vereinfachen. Das Initialisieren und Modifizieren der Containerelemente oder das Iterieren über diese wird damit wesentlich kompakter.

Abbildung 1: Die Move-Semantik in C++0x überträgt den Inhalt des einen Vektors in den anderen und vermeidet damit überflüssige Kopien.

Abbildung 1: Die Move-Semantik in C++0x überträgt den Inhalt des einen Vektors in den anderen und vermeidet damit überflüssige Kopien.

Abbildung 2: Die bisher übliche Copy-Semantik hinterlässt unnötige Kopien im Speicher, hier den Inhalt des ursprünglichen Vektors »vec2«.

Abbildung 2: Die bisher übliche Copy-Semantik hinterlässt unnötige Kopien im Speicher, hier den Inhalt des ursprünglichen Vektors »vec2«.

Abbildung 3: Die Ausgabe des Programms zeigt das Resultat der Lambda-Funktion und der Aggregatzuweisungen aus Listing 3.

Abbildung 3: Die Ausgabe des Programms zeigt das Resultat der Lambda-Funktion und der Aggregatzuweisungen aus Listing 3.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook