【发布时间】:2015-02-09 12:33:42
【问题描述】:
我已经阅读了无数关于复制构造函数和移动语义的文章。我觉得我“有点”明白发生了什么,但很多解释都忽略了幕后实际发生的事情(这就是让我感到困惑的原因)。
例如:
string b(x + y);
string(string&& that)
{
data = that.data;
that.data = 0;
}
对象在内存中实际发生了什么?所以你有一些对象'b' 接受x + y 这是一个右值,然后调用移动构造函数。这真的让我感到困惑......为什么要这样做?
我知道这样做的好处是“移动”数据而不是复制它,但我在这里迷失的地方是当我尝试将每个对象/参数在内存级别上发生的事情拼凑起来时。
对不起,如果这听起来令人困惑,谈论它甚至让我自己感到困惑。
编辑:
总之,我理解复制构造函数和移动构造函数的“为什么”......我只是不明白“如何”。
【问题讨论】:
-
在内存中:将
that.data的值复制到this->data并将that.data设置为0。没有“幕后”。 -
IDK 如果这会有所帮助,但 copy 可能是:
char *b = new char[strlen(a)+1]; strcpy(b, a); delete[] a; a = nullptr;,而 move 将是char *b = a; a = nullptr;。显然后者的分配更少,所以只要你想要这些语义,它就更好了。