Nieco zaskakująco (do mnie), następujące dwa programy kompilować do różnych wyjść, z tym drugim związkiem mającym znacznie lepsze osiągi (testowane z gcc i brzękiem):Automatyczne xvalue optymalizacja
#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);
}
}
Czy ktoś mógłby mi wyjaśnić, dlaczego kompilator robi (lub nie może) automatycznie rozważyć b
xvalue w ostatnim zadaniu i zastosować semantykę ruchu bez jawnego rzutowania std::move
?
Edit: Zestawione z (g++|clang++) -std=c++11 -O3 -o test test.cpp
Jakie parametry przekazujesz kompilatorom? – Joe
Moim pierwszym przypuszczeniem jest to, że zmieniłoby to semantykę programu w nieoczekiwany sposób, zamieniając kopię w ruch. – pmr
@pmr: To też podejrzewam, ale naprawdę chciałbym zrozumieć dlaczego. Naiwnie, wygląda dokładnie tak, jak powinna być dla mnie wartość. – Xoph