動機:減少非必要的拷貝
實現思路:
1、必須要語法讓我們在調用端告訴編譯器,這是個Rvalue std::move可以實現
2、必須有語法讓我們在被調用端寫出一個專門處理Rvalue的函數,參考std::string的實現
std::move 將實參強制轉換成了右值
測試代碼:
void test_move() {
for(int j = 13; j < 20; ++j) {
const int64_t times = 10;
std::string str = "tt";
for (int i = 0; i <= j; ++i) {
str += str;
}
cout << "test string size(kb):" << str.size()/1024 << endl;
cout << "move or copy times:" << times << endl;
std::vector<std::string> v_copy;
std::vector<std::string> v_move;
// 將使用 push_back(const T&), 即產生拷貝行爲
auto begin = std::chrono::steady_clock::now();
for (int i = 0; i < times; ++i)
v_copy.push_back(str);
auto time = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - begin).count();
cout << "copy time(us):" << time << endl;
auto begin2 = std::chrono::steady_clock::now();
for (int i = 0; i < times; ++i)
v_move.push_back(std::move(str));
time = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - begin2).count();
cout << "move time(us):" << time << endl;
}
}
move和copy的時間比,時間單位us
數據大小(kb) |
操作1次 |
操作5次 |
32k |
1/24 |
4/171 |
64k |
1/42 |
3/235 |
128k |
1/70 |
4/474 |
256k |
1/164 |
10/916 |
512k |
1/297 |
4/1698 |
1024k |
1/593 |
3/3165 |
2028k |
1/1326 |
4/5630 |