【问题标题】:Why isn't the boost::shared_ptr -> operator declared inline?为什么 boost::shared_ptr -> 运算符没有声明为内联?
【发布时间】:2010-05-18 14:38:52
【问题描述】:

由于boost::shared_ptr 可以被非常频繁地调用并简单地返回一个指针,所以-> 运算符不是inlined 的一个很好的候选者吗?

T * operator-> () const // never throws
{
    BOOST_ASSERT(px != 0);
    return px;
}

一个好的编译器会自动inline这个吗?

我应该为此失眠吗? :-)

【问题讨论】:

  • 现在,一个好的优化编译器会比你更好地决定应该内联什么,所以会忽略inline关键字。
  • @Blue:无论如何,忽略内联部分。但你是对的:编译器完全内联,不管inline 关键字。无 inlineinline'd 函数都可以内联。
  • @BlueRaja-DannyPflughoeft,@GMan:您对此有点过度概括了。如果您无法在启用完全优化的情况下进行编译(无论出于何种原因),您可能想要控制哪些函数要内联或不内联。然后inline 变得不那么无关紧要了。我不是专家,但我猜这是关键字存在的原因之一。
  • @Jörgen:关键字的存在是出于遗留原因。编译器在过去 10 到 15 年才真正变得“智能”,而 C++ 已经存在了大约 40 年。register 关键字也是如此。

标签: c++ boost inline shared-ptr


【解决方案1】:

在类中定义的函数(即使用主体)隐含地是内联的候选对象。在这些情况下没有必要使用inline 关键字,而且这种做法并不常见。

【讨论】:

    【解决方案2】:

    一个好的编译器会自动内联吗?

    很可能,是的,会的。

    我应该为此失眠吗?

    最好不要。如果您想非常确定(或者您非常好奇),请检查编译器输出的程序集。

    【讨论】:

      【解决方案3】:

      请注意shared_ptr是一个类模板,所以它的成员函数实际上是函数模板

      由于它们不是exported,它们不仅必须声明,而且必须在所有使用它们的翻译单元中定义,就像定义的函数一样使用 inline 存储说明符。

      在某种程度上,template 也意味着inline

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-24
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多