從Efficient way to return a std::vector in c++有效的方式,通過值從功能
#include <cstdio>
#include <vector>
#include <chrono>
std::vector<int> func1() {
std::vector<int> v;
v.reserve(1e6);
for (int i = 0; i < 1e6; i++) v.emplace_back(i);
return v;
}
std::vector<int> func2() {
std::vector<int> v;
v.reserve(1e6);
for (int i = 0; i < 1e6; i++) v.emplace_back(i);
return std::move(v);
}
int main() {
auto start1 = std::chrono::steady_clock::now();
std::vector<int> v1 = func1();
auto end1 = std::chrono::steady_clock::now();
printf("%d\n", std::chrono::duration_cast<std::chrono::nanoseconds>(end1-start1).count());
auto start2 = std::chrono::steady_clock::now();
std::vector<int> v2 = func2();
auto end2 = std::chrono::steady_clock::now();
printf("%d\n", std::chrono::duration_cast<std::chrono::nanoseconds>(end2-start2).count());
/*
auto start3 = std::chrono::steady_clock::now();
std::vector<int> v3 = v2;
auto end3 = std::chrono::steady_clock::now();
printf("%d\n", std::chrono::duration_cast<std::chrono::nanoseconds>(end3-start3).count());
*/
return 0;
}
在方法2返回STL向量這是排序的擴展問題,我明確地告訴我想移動,而不是複製矢量編譯器,但運行該代碼多次表明方法1實際上有時勝過方法2,並且即使方法2獲勝,也不是太多。
方法3始終是最好的。當我必須從函數返回時如何模擬方法3? (不,我不能按引用傳遞)
使用GCC 6.1.0
a)防止甚至最微小的不必要的編譯器優化量。作爲編譯器,我會刪除例如。 v3,所以第三個是最快的並不是你想知道的。 – deviantfan
請注意,您的基準測試存在缺陷:您還在計算向量中的插入時間,包括*重新分配*。 –
編譯器也可以使用'func1'的運動,它不需要複製。 –