3

在 Effective C++(第 18 条:使接口易于正确使用和难以错误使用)中,我看到了类似以下的代码示例:

class Month
{
public:
    static Month Jan()
    {
        return Month(1);
    }

    static Month Feb()
    {
        return Month(2);
    }

    //...

    static Month Dec()
    {
        return Month(12);
    }

private:
    explicit Month(int nMonth)
        : m_nMonth(nMonth)
    {
    }

private:
    int m_nMonth;
};

Date date(Month::Mar(), Day(30), Year(1995));

更改函数以使它们返回对 Month 的静态 const 引用是否有任何缺点?

class Month
{
public:
    static const Month& Jan()
    {
        static Month month(1);
        return month;
    }

    static const Month& Feb()
    {
        static Month month(2);
        return month;
    }

    //...

    static const Month& Dec()
    {
        static Month month(12);
        return month;
    }

private:
    explicit Month(int nMonth)
        : m_nMonth(nMonth)
    {
    }

private:
    int m_nMonth;
};

我认为第二个版本比第一个版本更有效。

4

2 回答 2

8

原因1:不是更好。

按值返回会产生复制整个对象的成本。

通过引用返回会产生复制有效指针的成本,以及取消引用该指针的成本。

因为Month是 的大小int

  • 复制参考并不比复制快Month
  • 每次访问该引用时都会发生取消引用。

所以一般来说,通过 const 引用返回是一种优化选择,以防止代价高昂的复制。

原因2:static让事情变得更糟

与 C 不同,C++ 承诺将在函数第一次调用时构造函数中的静态变量。

实际上,这意味着对函数的每次调用都必须以一些看不见的逻辑开始,以确定它是否是第一次调用。

另见沃恩卡托的回答

另见 ildjam 的评论

于 2012-07-07T15:29:03.177 回答
3

一些编译器不会内联包含静态局部变量的方法,而内联是这里最重要的性能优化。

于 2012-07-07T15:31:43.247 回答