const boost的目的::共享\u ptr<;T>&;作为函数参数? 我使用了一个大的、维护良好的开源C++库,并遇到了一个具有表单< /p>的构造函数的类定义。 class SomeClass { SomeClass( const boost::shared_ptr<SomeOtherClass>& ); } class-SomeClass{ SomeClass(const boost::shared_ptr&); }

const boost的目的::共享\u ptr<;T>&;作为函数参数? 我使用了一个大的、维护良好的开源C++库,并遇到了一个具有表单< /p>的构造函数的类定义。 class SomeClass { SomeClass( const boost::shared_ptr<SomeOtherClass>& ); } class-SomeClass{ SomeClass(const boost::shared_ptr&); },c++,boost,C++,Boost,我的问题是:通过引用传递const boost::shared\u ptr有什么意义?通过值传递boost::shared_ptr真的有不可忽略的开销吗,或者通过值传递boost::shared_ptr真的有其他我不知道的危险吗?通过值传递会复制它,从而导致引用计数增加,跨所有线程同步。绝对不可忽略。您不仅避免了复制共享\u ptr的任何(轻微)开销,而且还声明了不保留指针副本的意图。我不认为你可以在不修改的情况下复制一份shread\u ptr,而const可以防止这种情况发生。如果你不需要复

我的问题是:通过引用传递
const boost::shared\u ptr
有什么意义?通过值传递
boost::shared_ptr
真的有不可忽略的开销吗,或者通过值传递
boost::shared_ptr
真的有其他我不知道的危险吗?

通过值传递会复制它,从而导致引用计数增加,跨所有线程同步。绝对不可忽略。

您不仅避免了复制
共享\u ptr
的任何(轻微)开销,而且还声明了不保留指针副本的意图。我不认为你可以在不修改的情况下复制一份
shread\u ptr
,而
const
可以防止这种情况发生。

如果你不需要复制,为什么要复制?如果他们继续在正文中复制它,那将是另一个问题。

更惯用的方法是通过值传递本机数据类型,并通过常量引用传递其他内容,至少在我看来是这样。比亚恩在他的风格和技巧常见问题解答中提到了“值得”一词,而不是几个词。@chris:母语或习惯是无关紧要的。重要的是复制所需的时间。用
struct
包装的
int
可能仍然是按值来完成的最好方法。@DeadMG,对,但如果你想猜测大小,那么类很可能足够大,值得这么做。花时间检查你通过的每一个项目的大小并不值得节省这么多时间。在你完成分析之前,这两种方式都不重要。在那之前,这是宗教、猜测和假设。@CrazyEddie:我给你的不是宗教或猜测,而是假设,但这是一条很好的经验法则。一般来说,经验法则更好,除非您的应用程序的性能非常重要,必须进行评测。即使如此,通过参考和通过值之间的时间差可能会或可能不会出现在雷达上,即使差异很大,您确定如果您看到问题而不实际尝试两种方法,您会知道如何识别问题吗?在大多数情况下,这种情况下的经验法则可能更好。实际上,您可以复制
共享的\u ptr
,而无需修改它。复制
共享\u ptr
不会改变源。@DeadMG,但会修改指针对象本身。我们谈论的是
常量共享的ptr
,而不是
共享的ptr
。我必须承认我从来没有尝试过。@ MarkRansom,你忘记了我们可以在C++中定义const,但是我们想要。碰巧,创建shared_ptr的人将const定义为不修改包含的对象。正如您所描述的,可能很容易出现const,无法修改容器。@EthanSteinberg:事实上,共享\u ptr上的const并不阻止您修改包含的对象,它确实阻止您修改容器(共享\u ptr对象),就像在中一样,您不能让它指向其他对象。(我可能误解了你)@BenjaminLindley Oops,混淆了const int*语义和const shared_ptr语义。很好,我认为在多线程环境中传递值变得非常重要,因为在多线程环境中,这些影响实际上会被注意到。传递引用和共享指针可以在执行传递给的函数时有效地删除,因为该引用在共享方案中不计算在内。