1

Node是我们解析图时用来存储Node的数据结构。

这是示例代码:

struct NodeA {
    vector<string> vecStrs; // the size of the vecStrs keeps increasing!
};
struct NodeB {
    vector<boost::shared_ptr<string> > vecShpStrs;
};

struct NodeC {
    boost::shared_ptr<vector<string> > shpVecStrs;
};

int main()
{
    NodeA nodeA;
    nodeA.vecStrs.push_back("stringA");    // input
    cout << "Output from NodeA: " << nodeA.vecStrs.front() << endl; // output

    NodeB nodeB;
    nodeB.vecShpStrs.push_back(boost::make_shared<string>("stringB"));
    cout << "Output from NodeB: " << *(nodeB.vecShpStrs.front()) << endl;

    NodeC nodeC;
    nodeC.shpVecStrs.reset(new vector<string>());
    nodeC.shpVecStrs->push_back("stringC");
    cout << "Output from NodeC: " << nodeC.shpVecStrs->front() << endl;
}

请验证我的理解,看看是否正确

问题 1.1 > 每当复制 NodeB 的实例时,存储在向量中的元素集合也会被复制。由于每个元素都是一个 shared_ptr,因此与 NodeA 相比,复制操作的成本更低。

问题 1.2 > 每当复制 NodeC 的实例时,唯一复制的元素是 shared_ptr 并且不复制底层向量,而是在所有引用的 shared_ptr 之间共享它。

问题 2 > 应该使用 NodeC 的工具来使副本成本最低。如果是这样(我怀疑),为什么我大部分时间都看到使用 NodeB 而不是 NodeC?

谢谢

4

2 回答 2

2

1.1) 正确

1.2) 正确

2.0) 因为 boost::shared_ptr 的主要用途不是提供廉价副本,而是管理生命周期。否则,原始指针也足够了。向量通常被定义为成员对象,并随其父对象自动销毁,其中位于向量中的对象被插入、删除和移动。

于 2013-06-07T15:12:33.603 回答
1

Question 2> The implement of NodeC should be used to make the copies least expensive. If that is the case(I doubt), why I see the usage of NodeB most of the time instead of NodeC?

As enigma said, is wrong to use NodeC for making copies, since you are not copying the vector, just sharing it (copying the smart pointer). For example:

NodeC nodeC;
nodeC.shpVecStrs.reset(new vector<string>());
nodeC.shpVecStrs->push_back("stringC");
assert(nodeC.shpVecStrs->size() == 1);

NodeC nodeC2 = nodeC;
nodeC2.shpVecStrs->push_back("other string");
assert(nodeC2.shpVecStrs->size() == 2);
assert(nodeC.shpVecStrs->size() == 2); // they are the same pointer.
于 2013-06-07T15:51:39.070 回答