Etwas überraschend (für mich), die folgenden zwei Programme zu unterschiedlichen Ausgängen kompilieren, wobei letztere eine viel bessere Leistung aufweisen (mit gcc und Klirren getestet):Automatische xValue Optimierung
#include <vector>
int main()
{
std::vector<int> a(2<<20);
for(std::size_t i = 0; i != 1000; ++i) {
std::vector<int> b(2<<20);
a = b;
}
}
vs.
#include <vector>
int main()
{
std::vector<int> a(2<<20);
for(std::size_t i = 0; i != 1000; ++i) {
std::vector<int> b(2<<20);
a = std::move(b);
}
}
Könnte mir jemand erklären, warum der Compiler tut (oder können) nicht automatisch b
ein xValue in der letzten Zuweisung betrachten und zu bewegen Semantik ohne ausdrückliche std::move
Guss anwenden?
bearbeiten: Zusammengestellt mit (g++|clang++) -std=c++11 -O3 -o test test.cpp
Welche Parameter übergeben Sie an die Compiler? – Joe
Meine erste Vermutung ist, dass dies die Semantik des Programms auf eine unerwartete Weise ändern würde, indem man eine Kopie in eine Bewegung umwandelt. – pmr
@pmr: Das vermute ich auch, aber ich würde wirklich gerne verstehen warum. Naiv scheint es genau zu sein, was ein xvalue für mich sein sollte. – Xoph