好吧,我一直在阅读有关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