构造函数依赖注入:unique_ptr + move vs shared_ptr

时间:2016-11-02 09:19:46

标签: c++ c++11 c++14 shared-ptr unique-ptr

我们假设我们有类似的东西:

struct Complex{
    Complex(Part1 p1, Part2 p2, Part3 p3)
}

Part1 p1; 
Part2 p2;
Part3 p3; 

然而,传递副本无效,因此我们需要转向指针。问题是要使用的类型 - unique_ptrshared_ptr

乍一看,由于Complexp1, p2, p3的真正所有者,因此似乎unique_ptr更好;但是,由于无法复制,我们需要使用std::move

所以我的问题是 - 对于这种情况有什么更好的方法,从unique_ptr创建Part,然后在move的构造函数中使用Complex,或者从头开始创建shared_ptr并改为使用shared_ptr

1 个答案:

答案 0 :(得分:11)

最好的解决方案是让Part类型便宜移动,然后将它们移入。但是,如果这不是一个选项,则必须动态管理它们。

正如你所说,Complex拥有部分,所以它应该接受它们为std::uniqe_ptr<Part>并将这些指针移动到自身。移动std::unique_ptr非常便宜:它可能只会引用两个指针。

另一方面,使用std::shared_ptr并复制涉及不必要的原子增量(用于创建副本)和减少(用于销毁原始文件)。对于当今的高速缓存,多核处理器而言,原子操作当然远非便宜。

因此,只需坚持代码的预期语义(唯一所有权,由std::unique_ptr惯用表示),您将获得良好的表现作为奖励。