虽然我花了一点时间来适应,但我现在已经养成了一个习惯,即让我的函数通过左值引用传递共享指针参数到const
,而不是按值传递(当然,如果我需要修改原始参数,我会通过左值引用传递非const
参数):
void foo(std::shared_ptr<widget> const& pWidget)
// ^^^^^^
{
// work with pWidget...
}
这样做的好处是避免了不必要的共享指针副本,这意味着线程安全地增加引用计数并可能产生不必要的开销。
现在我一直在思考是否采用一种对于从函数中以值返回的共享指针具有相对称习惯的方法,例如在以下代码片段的末尾检索:
struct X
{
// ...
std::shared_ptr<Widget> bar() const
{
// ...
return pWidget;
}
// ...
std::shared_ptr<Widget> pWidget;
};
// ...
// X x;
std::share_ptr<Widget> const& pWidget = x.bar();
// ^^^^^^
采用这种编码习惯有什么注意事项吗?一般情况下,将返回的共享指针分配给另一个共享指针对象而非绑定到引用上是否更好呢?
Widget
分配内存,那么在其结束后,将不会有任何共享的内容。因此,从一开始就返回shared_ptr
没有太多意义。使用unique_ptr
更为适当,是吧? - Joseph Mansfieldbar()
最常见的是一个成员函数,它返回一个数据成员shared_ptr
。已经编辑问题以反映这一点。 - Andy Prowlmake_shared
创建shared_ptr
可以通过减少成本(一个 vs. 两个内存分配)来帮助。 - David Rodríguez - dribeas