Несколько неожиданно (для меня) следующие две программы скомпилированы для разных выходов, причем последняя обладает гораздо лучшей производительностью (проверена с помощью gcc и clang):
#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;
}
}
против.
#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);
}
}
Может ли кто-нибудь объяснить мне, почему компилятор (или не может) автоматически рассматривать b
значение xvalue в последнем назначении и применять семантику перемещения без явного выражения std::move
?
Изменить: скомпилировано с (g++|clang++) -std=c++11 -O3 -o test test.cpp