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

sil*_*der 3 c++ shared-ptr unique-ptr c++11 c++14

我们假设我们有这样的事情:

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

Part1 p1; 
Part2 p2;
Part3 p3; 
Run Code Online (Sandbox Code Playgroud)

但是,传递副本无效,因此我们需要转移到指针.问题是使用什么类型 - unique_ptrshared_ptr

乍一看,既然Complex是真正的主人p1, p2, p3,那似乎unique_ptr更好; 但是,由于无法复制,我们需要使用std::move.

所以我的问题是-什么是这种情况下,更好的办法,创造unique_ptr出的Part,然后用moveComplex类的构造函数,或者创建shared_ptr自beggining和使用shared_ptr呢?

Rei*_*ica 11

最好的解决方案是使Part类型移动便宜,并将它们移入.但是,如果这不是一个选项,您将不得不求助于动态管理它们.

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

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

因此,只需坚持您的代码的预期语义(独特的所有权,由其惯性表达std::unique_ptr),您将获得良好的性能作为奖励.

  • @GeorgeAl一个将目标指向指针对象,一个指向源指向null.否则,源的析构函数不会知道它是空的,并且会释放指针. (2认同)