有点令人惊讶(对我来说),以下两个程序编译为不同的输出,后一个程序具有更好的性能(用 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