作为函数参数的const boost::shared_ptr<T>&的目的是什么?

4

我是一个使用某个大型且维护良好的开源C++库的用户,遇到了一个类定义,其构造函数形式如下:

class SomeClass {
    SomeClass( const boost::shared_ptr<SomeOtherClass>& );
}

我的问题是:为什么要通过引用传递一个const boost::shared_ptr<T>?传递boost::shared_ptr<T>的值是否确实存在不可忽略的开销,或者传递boost::shared_ptr<T>的值存在其他隐患,而我却不知道?

更通俗的方法是传递本地数据类型的值和其他内容使用const引用,至少从我看到的情况来看是如此。Bjarne在他的Style and Technique FAQ中提到,对于任何大于几个字的参考,“值得”。 - chris
@chris:本地或自定义都不重要,重要的是复制所需的时间。用值传递可能仍然是将int包装在struct中最好的选择。 - Puppy
@DeadMG,没错,但如果你要猜测大小,那么类很可能已经足够大了,这是值得的。花时间检查每个传递的大小并不值得节省的少量时间。 - chris
在进行性能分析之前,两种方式都无所谓。在此之前,只能是信仰、猜测和假设。 - Edward Strange
@CrazyEddie:不是宗教或猜测,我会给你一个假设,但这是一个好的经验法则。 经验法则在一般情况下更好,除非您的应用程序性能非常重要,需要进行分析。 即使如此,按引用传递和按值传递之间的时间差异可能甚至不会出现在雷达上,即使差异很大,您确定如果没有尝试两种方法,您会知道如何识别问题吗? 在大多数情况下,遵循这种情况下的经验法则可能更好。 - phonetagger
显示剩余7条评论
3个回答

9

将其按值传递将复制它,这会导致引用计数增加,并在所有线程之间同步。绝对不能忽略。


1
我想在多线程环境中,按值传递变量变得非常重要,因为这些影响实际上是可以被注意到的。如果按引用传递变量,那么在你执行传递函数时,你的共享指针可能会被有效地删除,因为引用在共享方案中不计数。 - Edward Strange

1

你不仅避免了复制 shared_ptr 的任何(轻微)开销,而且还声明了你不打算保留指针的副本。我认为你不能在不修改它的情况下复制 shred_ptr,而 const 可以防止这种情况发生。


确实,您可以复制一个shared_ptr而不修改它。复制shared_ptr不会改变源。 - Puppy
@DeadMG,但它确实修改了指针对象本身。我们谈论的是const shared_ptr<T>,而不是shared_ptr<const T>。我必须承认我从未尝试过。 - Mark Ransom
@MarkRansom,你忘了我们可以按照自己的方式在C++中定义const。只是碰巧制作shared_ptr的人将const定义为不修改所包含的对象。同样地,也可以像你描述的那样定义const,即不能修改容器。 - user406009
@EthanSteinberg:实际上,对于shared_ptr来说,const并不能防止你修改其中包含的对象,但它确实可以防止你修改容器本身(即shared_ptr对象),也就是说,你不能将其指向其他内容。(我可能误解了你的意思) - Benjamin Lindley
@BenjaminLindley 哎呀,我把 const int* 的语义和 const shared_ptr 的语义搞混了。好发现。 - user406009
显示剩余3条评论

1
如果你不需要副本,那为什么要复制呢?如果他们还是在正文中复制了它,那就另当别论了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接