【问题标题】:Purpose of const boost::shared_ptr<T>& as function argument?const boost::shared_ptr<T>& 作为函数参数的目的?
【发布时间】:2012-05-05 10:22:16
【问题描述】:

我正在使用某个大型且维护良好的开源 C++ 库,并且遇到了一个具有以下构造函数的类定义

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

我的问题是:通过引用传递 const boost::shared_ptr&lt;T&gt; 有什么意义?通过值传递boost::shared_ptr&lt;T&gt; 是否真的存在不可忽略的开销,或者通过值传递boost::shared_ptr&lt;T&gt; 是否存在其他我不知道的危险?

【问题讨论】:

  • 至少从我所看到的情况来看,更惯用的方法是按值传递本机数据类型,并通过 const 引用传递其他内容。 Bjarne 在他的风格和技术常见问题解答中提到了“值得”的任何东西,而不是几个词。
  • @chris:本地或自定义无关紧要。重要的是复制所花费的时间。包裹在 struct 中的 int 仍然可能最好按价值完成。
  • @DeadMG,没错,但如果你要猜测大小,那么类很可能足够大,值得。花时间检查您通过的每个人的大小不值得节省少量时间。
  • 在您进行分析之前,这两种方式都没有关系。在那之前,它是宗教、猜测和假设。
  • @CrazyEddie:不是宗教或猜测,假设我会给你,但这是一个很好的经验法则。一般来说,经验法则更好,除非您的应用程序的性能非常重要,以至于必须进行分析。即便如此,pass-by-ref 和 pass-by-value 之间的时间差异可能会或可能不会出现在雷达上,即使差异很大,您确定您知道如何识别问题,如果你看到它没有真正尝试两种方式?在这种情况下,经验法则在大多数情况下可能会更好地坚持。

标签: c++ boost


【解决方案1】:

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

【讨论】:

  • 我想在多线程环境中传递值变得非常重要,在这些环境中,这些效果实际上是被注意到的。通过引用传递,当您执行传递给它的函数时,您的共享指针可能会被有效地删除,因为引用不计入共享方案。
【解决方案2】:

您不仅避免了复制shared_ptr 的任何(轻微)开销,而且还声明了不保留指针副本的意图。我认为您不能在不修改 shred_ptr 的情况下复制它,而 const 会阻止这种情况。

【讨论】:

  • 实际上,您可以复制shared_ptr 而无需修改它。复制 shared_ptr 不会改变源代码。
  • @DeadMG,但它确实修改了指针对象本身。我们谈论的是const shared_ptr&lt;T&gt;,而不是shared_ptr&lt;const T&gt;。我必须承认我从未尝试过。
  • @MarkRansom 您忘记了我们可以在 C++ 中随意定义 const。碰巧制作 shared_ptr 的人将 const 定义为不修改包含的对象。可能就像您描述的那样容易 const,无法修改容器。
  • @EthanSteinberg:实际上,shared_ptr 上的 const 不会阻止您修改包含的对象,它确实会阻止您修改容器(shared_ptr 对象),例如,您不能它指向别的东西。 (我可能误解了你)
  • @BenjaminLindley 哎呀,混淆了 const int* 语义和 const shared_ptr 语义。很好的收获。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多