我有一行只在一次計算中重複使用結構類型變量,其結果被分配回變量本身。如何使用c + + 11移動語義明確避免複製
for (int i = 0; i < 100; i++)
e = f(i,e); //how to avoid copying
整個代碼如下。我的問題是,
如何明確確保e
內的數據未被複制多次。
移動語義是一個很好的選擇嗎?
如何使用移動比較定義e
作爲一個普通的非常量引用?
#include <vector>
using namespace std;
struct arr {
vector<int> data;
int len;
};
arr f(int x,arr xs) {
xs.data.push_back(x);
return xs;
}
arr g() {
arr e;
for (int i = 0; i < 100; i++)
e = f(i,e); //how to avoid copying
return e;
}
int main() {
auto res = g(); return 0;
}
---編輯---
最接近於我所尋找的是在有關更改至e = f(i,std::move(e))
評論。根據我的理解,它明確告訴編譯器(第二次出現)e
不再需要,它的資源可以被採用,我猜這是編譯器無法推斷並且必須被告知的。
我以這種方式編寫示例代碼的原因是我想避免在void f
中使用非const引用,並且在不犧牲效率的情況下獲得非副作用代碼的美觀/錯覺。我認爲這是移動語義學購買我們的一件事,對吧? (允許標準容器被「複製」)。我僞造了len
字段和struct
來做個例子,因爲stl容器已經有了所有的移動語義處理程序。
鑑於我從答案學會爲止,我的問題其實歸結爲: 之前,我在代碼中使用e = f(i,std::move(e))
後,有多少vector
複製操作真的發生了?它是沒有或100?爲什麼?
我需要聲明f
爲arr f(int x,arr&& xs) {
,爲什麼或爲什麼不需要使用&&
?
爲什麼不通過引用將arr傳遞給f? –
'e = f(i,std :: move(e));' – qwm