虽然已经有很多关于 SO 上的复制构造函数/赋值运算符的问题,但我没有找到适合我的问题的答案。
我有一个像
class Foo
{
// ...
private:
std::vector<int> vec1;
std::vector<int> vec2;
boost::bimap<unsigned int, unsigned int> bimap;
// And a couple more
};
现在似乎有一些相当多的复制正在进行(基于配置文件数据)。所以我的问题是如何最好地解决这个问题?
我应该实现自定义复制构造函数/赋值运算符并使用交换吗?或者我应该定义自己的交换方法并使用它(在适当的情况下)而不是赋值?
由于我不是 C++ 专家,因此非常感谢展示如何正确处理这种情况的示例。
更新:看来我不是很清楚..让我试着解释一下。该程序基本上是一个即时广度优先搜索程序,对于所采取的每一步,我都需要存储有关该步骤(即Foo
类)的元数据。现在的问题是(通常)有指数级的步骤,所以你可以想象需要存储大量这些对象。据我所知,我总是通过(const)引用。每次我从图中的节点计算后继者时,我都需要创建和存储一个 Foo 对象(但是,在处理这个后继对象时,一些数据成员将被添加到这个 foo 中)..
我的个人资料数据大致如下所示(我没有这台机器上的实际数字):
SearchStrategy::Search 13s
FooStore::Save 10s
所以你可以看到我在保存这些元数据上花费的时间几乎和我在图表中搜索所花费的时间一样多。哦,FooStore 保存Foo
在一个google::sparse_hash_map<long long, Foo, boost::hash<long long> >
.
编译器是 g++4.4 或 g++4.5(我不在我的开发机器上,所以我现在无法检查)..
更新 2我在构造后将一些成员分配给 Foo 实例,例如
void SetVec1(const std::vector<int>& vec1) { this->vec1 = vec1; };
我想明天,我应该把它改成使用交换方法,这肯定会改进一点..
如果我不完全清楚我想要实现什么语义,我很抱歉,但原因是我不太确定。
问候,
莫腾