我提供以下代码来说明我的问题。假设LargeClass
是一个包含许多内部变量的类,如以下代码所示。
class LargClass
{
public:
std::vector<int> abc={1,2,3, ...., 10000};
}
现在假设
LargeClass
成为另一个类Abc
的元素,如以下代码所示:class Abc
{
public:
std::vector<LargeClass> obj;
};
由于在构造
std::vector<LargeClass>
类对象时初始化Abc
的开销非常大,因此一种可行的解决方案是在构造Abc后构造std::vector<LargeClass>
元素,如下所示:Abc abcObj;
abcObj.obj.resize(3);
....
...
代替以昂贵的方式初始化
std::vector<LargeClass>
:class Abc
{
public:
Abc(std::vector<LargeClass> objTemp)
{
obj = objTemp;
}
}
当然,还有其他解决方案。一种解决方案是使用指针
class Abc
{
public:
Abc(std::vector<LargeClass> &obj)
{
pObj = &obj;
}
std::vector<LargeClass> *pObj;
}
但是,使用此解决方案,我们必须确保给定的
std::vector<LargeClass> &obj
在类Abc
的生存期内始终存在。为了解决此问题,另一个解决方案是使用shared_ptr
:class Abc
{
public:
Abc(boost::shared_ptr<std::vector<LargeClass>> obj)
{
pObj = obj;
}
boost::shared_ptr<std::vector<LargeClass> > pObj;
}
所以我的问题是:哪种解决方案更好?对我来说,我更喜欢第一个,但它不适合面向对象编程的规则。有什么建议么?
最佳答案
使用move构造函数:
class Abc
{
public:
Abc(std::vector<LargeClass> objTemp) : obj(std::move(objTemp)) {}
private:
std::vector<LargeClass> obj;
};
要么
class Abc
{
public:
Abc(std::vector<LargeClass>&& objTemp) : obj(std::move(objTemp)) {}
private:
std::vector<LargeClass> obj;
};
如果
LargeClass
仅是可移动的(不可复制),则两种解决方案主要是等效的。如果
LargeClass
是可复制的,我建议第二个强制正确使用。如果您要避免复制(建议实施廉价的移动构造函数),建议删除
LargeClass
的复制构造函数。关于c++ - 在C++中合并大型类元素的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38754683/