rvalues c ++ 0x并移动到堆

ani*_*nio 0 c++11

好吧,我一直在读rvalues,它们似乎是一个好主意,但有些东西一直困扰着我.特别是移动的主张允许我们窃取资源并避免复制.

我理解移动是有效的,并且确实避免复制堆栈上发生的所有事情,但最终在堆栈上完成的大部分内容会产生一些我们想要复制到堆中的值,这是我认为移动不起作用的地方.

假设int有一个移动赋值运算符,给定以下代码:

struct Foo
{
int x;
};

void doIt()
{
Foo* f = new Foo();
f->x = (2 + 4);
}
Run Code Online (Sandbox Code Playgroud)

因此,在这个例子中,由(2 + 4)得到的rvalue可以推移到f-> x而不是复制.好,太棒了.但是f和f-因此f-> x在堆上并且rvalue在堆栈上.似乎无法避免副本.你不能简单地将f-> x指向rvalue的内存.一旦它结束,那个右值就会被吹走.副本似乎是必要的.

我是对的,我会做一个副本吗?还是我错了?或者我是否完全误解了右值概念?

Jer*_*fin 5

在这种情况下,它可能会复制,但由于该对象只包含一个int,这并不是一个问题.

您关心的时间通常是当对象包含指向堆上分配的某些数据的指针时(无论对象本身的分配位置如何).在这种情况下,避免分配该数据的新副本是非常值得的(因为即使对象本身在堆栈上,它也在堆上,无论对象本身位于何处,都可以移动它).