好吧,我一直在閱讀有關rvalues,他們看起來像一個好主意,但有些事情一直在困擾着我。特別是移動的聲明允許我們竊取資源並避免複製。rvalues C++ 0x and moving to stack
我知道移動的工作原理並避免複製堆棧上發生的所有事情,但最終在堆棧上完成的大部分工作產生了一些我們希望複製到堆中的值,這是我不認爲的地方移動作品。
假設INT具有移動賦值運算符,給出下面的代碼:
struct Foo
{
int x;
};
void doIt()
{
Foo* f = new Foo();
f->x = (2 + 4);
}
因此,在此實例中,右值從(2 + 4)得到的推測可以被移動到F-> X代替的複製。好的,太好了。但f和因此f-> x在堆上,並且右值在堆棧上。似乎不可能避免複製。你不能簡單地將f-> x指向右值的內存。一旦它結束,這個右值就會被吹走。副本似乎是必要的。
所以我是正確的,將複製副本? 還是我錯了? 還是我完全誤解了右值概念?
看來你是誤解了一些東西。移動不是魔術,沒有比分配/複製更快的獲取int值的方法。 – UncleBens 2010-12-10 15:56:09
@UncleBens嗯,我只是想確認一下。我不斷閱讀右值使事情更快,避免複製。但正如在我的例子中,我試圖確認複製確實是必需的,並且右值僅在某些特定情況下有所幫助。 – anio 2010-12-10 16:01:58
標量類型的移動對象相當於複製它們。移動對於更復雜的類型變得有趣。如果您將這些事情發生在班級設計師身上,會發生什麼。您可以通過定義您自己的移動構造函數來控制此行爲。 – sellibitze 2010-12-10 20:48:43