gpt4 book ai didi

c++ - 您应该将自动拷贝 move 到成员中还是保留它?

转载 作者:太空宇宙 更新时间:2023-11-04 11:43:25 28 4
gpt4 key购买 nike

如果你正在复制一些东西来存储在一个类中,像这样:

struct S {
S(std::vector<int> v);
private:
std::vector<int> m; // gonna store v in here
};

我听说你应该让编译器通过按值获取 v 来为你制作拷贝,因为它有时可以更有效地做到这一点。但是,在构造函数的成员初始化列表中,应该用v 还是std::move(v) 来初始化m?如果 v 的类型是只能 move 的类型怎么办? (在后一种情况下,我假设您必须使用 move。)

最佳答案

如果它是仅 move 的,那么是的,您最好的行动方案是按值获取参数,然后 move 。

当 v 的类型可以复制或 move 时,我会将“最佳实践”的状态描述为有些不稳定,并且目前存在不同的思想流派。但我认为,这正在被接受为编写您需要的最佳 move 感知构造函数的方法。

我会说,按照您在此处所做的操作,是的,使用 move 转换从右值初始化成员。

当您使用构造函数时,请尝试利用复制省略。例如,这个:

struct S {
S(std::vector<int> v) : m(std::move(v)) {}
private:
std::vector<int> m;
};

std::vector<int> create_vector()
{
std::vector<int> vec = // initialisation stuff

return vec;
}

int main()
{
S instance_of_s{create_vector()};
return 0;
}

... 由于各种复制省略,理想情况下不应复制任何内容。但当然,这取决于编译器。

这是一个演示这一点的例子。

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class VectorWrapper
{
public:
VectorWrapper() : vec(){}

VectorWrapper(const VectorWrapper& other) : vec(other.vec){ cout << "COPY" << endl; }

VectorWrapper(VectorWrapper&& other) : vec(move(other.vec)){ cout << "MOVE" << endl; }

private:
vector<int> vec;
};

struct S
{
S(VectorWrapper v) : m(move(v)) {}
private:
VectorWrapper m;
};

int main()
{
S instance_of_s{VectorWrapper()};
return 0;
}

在 GCC 4.7.2 下输出是:

MOVE

引用资料:

http://cpptruths.blogspot.co.uk/2012/03/rvalue-references-in-constructor-when.html

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

(请注意,这是一系列文章,我错过了开始的链接!)

关于c++ - 您应该将自动拷贝 move 到成员中还是保留它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20552135/

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