我研究過C++ 11移動語義,我有這樣一個問題。C++ 11移動語義與C++ 98
例如:
如果我們有一個
vector<T> vt; // also assume that T have pointers on data in separate memory
vt.push_back(...);
承擔vt
缺乏未使用的容量。然後在C++ 98中,它將爲每個T對象分配更多的內存併爲它們指向的數據複製(調用構造函數副本)。
例如:
T1 - > T1數據=>將被複制t_cop1 - >(t1_cop1數據) T2 - > T2數據=> t_cop2 - >(t2_cop2數據)
C++ 11移動語義允許移動所有T對象(只需複製指針,但不要通過調用移動構造函數將數據複製到單獨的內存中)。我們爲什麼不能在push_back中複製內存(其中包含指針t1,t2,因此t_cop1和t2_cop2將使用相同的指針創建),所以我們不能實現push_back,然後釋放它(t1和t2使用free(void*)
爲例)?
UPD:好吧,我會盡量解釋更簡單的例子,我的問題:
舉例來說,如果我們有一個包含一個指向某個數據結構數據的類。 我們實現一個拷貝構造函數是複製指針「數據」
class A {
public:
A() {};
A(const A& a) {
data = a.data;
}
private:
struct Data{};
Data* data;
};
// And I want to implement "move semantics" by calling the copy constructor (that copies just pointer)
A* a = new A();
A* b(a);
// and then somehow free "a" object (but not call the destructor)
free(a); // or a = NULL
按照我的理解,這就是移動語義幾乎做(但在某種一致的狀態留下)。所以我認爲我們實際上有能力在舊C++中實現移動。不是嗎?
此外,我們可以做在前面的例子一樣用向量
我認爲你誤解了移動語義...... –
這裏沒有區別C++ 11和C++ 98,因爲移動指針時指針只是被複制。另外一個'vector'其中'T'是一個指針,只會圍繞指針移動,而不會指向指針。 –
nwp
實際上,但C++ 98將調用深度複製,因此它不僅會複製指針,還會複製指針指向的所有數據。所以問題是爲什麼我們不能實現移動語義的C++ 98 – Nikita