少し驚いたことに (私には)、次の 2 つのプログラムは異なる出力にコンパイルされますが、後者の方がパフォーマンスがはるかに優れています (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