gpt4 book ai didi

c++ - 从函数返回对对象的静态常量引用

转载 作者:太空狗 更新时间:2023-10-29 19:53:43 24 4
gpt4 key购买 nike

在Effective C++(Item 18:Make interfaces easy to use and hard to use incorrectly)中,我看到了类似下面的代码示例:

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 的静态常量引用是否有任何缺点?

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;
};

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

最佳答案

原因 1:没有更好。

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

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

由于 Monthint 的大小:

  • 复制引用并不比复制月份
  • 每次访问该引用时都会发生取消引用。

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

原因 2:static 使情况变得更糟

与 C 不同,C++ promise 函数中的静态变量将在函数首次调用时构造。

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

另见 Vaughn Cato 的回答

另见 ildjam 的评论

关于c++ - 从函数返回对对象的静态常量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com