我们假设我们有类似的东西:
struct Complex{
Complex(Part1 p1, Part2 p2, Part3 p3)
}
Part1 p1;
Part2 p2;
Part3 p3;
然而,传递副本无效,因此我们需要转向指针。问题是要使用的类型 - unique_ptr
或shared_ptr
乍一看,由于Complex
是p1, p2, p3
的真正所有者,因此似乎unique_ptr
更好;但是,由于无法复制,我们需要使用std::move
。
所以我的问题是 - 对于这种情况有什么更好的方法,从unique_ptr
创建Part
,然后在move
的构造函数中使用Complex
,或者从头开始创建shared_ptr
并改为使用shared_ptr
?
答案 0 :(得分:11)
最好的解决方案是让Part
类型便宜移动,然后将它们移入。但是,如果这不是一个选项,则必须动态管理它们。
正如你所说,Complex
拥有部分,所以它应该接受它们为std::uniqe_ptr<Part>
并将这些指针移动到自身。移动std::unique_ptr
非常便宜:它可能只会引用两个指针。
另一方面,使用std::shared_ptr
并复制涉及不必要的原子增量(用于创建副本)和减少(用于销毁原始文件)。对于当今的高速缓存,多核处理器而言,原子操作当然远非便宜。
因此,只需坚持代码的预期语义(唯一所有权,由std::unique_ptr
惯用表示),您将获得良好的表现作为奖励。