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