gpt4 book ai didi

c++ - 通过跟随对象复制构造函数和移动语义

转载 作者:行者123 更新时间:2023-11-30 02:42:06 24 4
gpt4 key购买 nike

我阅读了无数关于复制构造函数和移动语义的文章。我觉得我“有点”明白发生了什么,但很多解释都忽略了幕后实际发生的事情(这让我感到困惑)。

例如:

string b(x + y);

string(string&& that)
{
data = that.data;
that.data = 0;
}

对象在内存中实际发生了什么?所以你有一些对象 'b' 接受 x + y 这是一个右值,然后调用移动构造函数。这真的让我感到困惑......为什么要这样做?

我知道这样做的好处是“移动”数据而不是复制数据,但我在这里迷路的地方是当我试图拼凑内存级别的每个对象/参数发生的情况时。

抱歉,如果这听起来令人困惑,谈论它甚至让我自己感到困惑。

编辑:

总而言之,我了解复制构造函数和移动构造函数的“原因”……我只是不了解“如何”。

最佳答案

发生的事情是一个复杂的对象通常不会完全基于堆栈。让我们举一个例子对象:

class String {
public:
// happy fun API
private:
size_t size;
char* data;
};

与大多数字符串一样,我们的字符串是一个字符数组。它本质上是一个包含字符数组和适当大小的对象。

在复制的情况下,涉及两个步骤。首先复制 size,然后复制 data。但是 data 只是一个指针。所以如果我们复制对象然后修改原来的,这两个地方指向相同的数据,我们的拷贝发生变化。这不是我们想要的。

因此,必须做的是做我们第一次创建对象时所做的同样的事情,new data 到适当的大小。

所以当我们复制对象时,我们需要做类似的事情:

String::String(String const& copy) {
size = copy.size;
data = new int[size];
memcpy(data, copy.data, size);
}

但另一方面,如果我们只需要移动数据,我们可以这样做:

String::String(String&& copy) {
size = copy.size;
data = copy.data;
copy.size = 0;
copy.data = nullptr; // So copy's dtor doesn't try to free our data.
}

现在在幕后,指针有点……传递给了我们。我们不必分配更多信息。这就是为什么移动是首选的原因。在堆上分配和复制内存可能是一项非常昂贵的操作,因为它不是发生在堆栈本地,而是发生在其他地方,因此必须获取内存,它可能不在缓存中,等等。

关于c++ - 通过跟随对象复制构造函数和移动语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27415846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com