构造函数依赖注入:unique_ptr + move vs shared_ptr
Constructor dependency injection: unique_ptr + move vs shared_ptr
让我们假设我们有这样的内容:
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
。
我的问题是—对于这种情况,更好的方法是在Part
中创建unique_ptr
,然后在Complex
的构造函数中使用move
,还是从一开始创建shared_ptr
并使用shared_ptr
?
最好的解决方案是使Part
类型的移动成本更低,并将它们移动进来。但是,如果这不是一个选项,您将不得不诉诸于动态管理它们。
正如你所说,Complex
拥有这些部分,所以它应该接受它们作为std::uniqe_ptr<Part>
,并将这些指针移动到自己身上。移动std::unique_ptr
非常便宜:它可能只涉及两次指针赋值。
std::shared_ptr
和复制涉及不必要的原子递增(用于创建副本)和递减(用于销毁原始)。原子操作对于今天缓存量大的多核处理器来说当然不便宜。
因此,只要坚持代码的预期语义(唯一所有权,这是由std::unique_ptr
习惯表达的),您将获得良好的性能作为奖励。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- CLANG 编译器 说:变量"PTR"可能未初始化
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- const char * ptr vs char ptr []
- 遍历链表: while(ptr!=NULL) vs while(ptr->next!=NULL)?