首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++由Const引用传递,由Const引用返回

C++由Const引用传递,由Const引用返回
EN

Stack Overflow用户
提问于 2010-07-09 22:29:57
回答 5查看 2.2K关注 0票数 10

我试图理解返回const引用是否有任何好处。我有一个阶乘函数,通常如下所示:

代码语言:javascript
复制
unsigned long factorial(unsigned long n)
{
    return (n == 0) ? 1 : n * factorial(n - 1);
}

我假设当我们传递const引用并返回一个const引用时,性能会有提高.但是const-correctness 总是让感到困惑。

代码语言:javascript
复制
const unsigned long & factorial(const unsigned long& n)
{
    return (n == 0) ? 1 : n * factorial(n - 1);
}

返回const引用有效吗?此外,有谁能告诉我:这是否有益?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-09 22:34:45

这是无效的。您不能引用返回到局部变量。

MSVS C++编译器甚至提供了以下警告:

代码语言:javascript
复制
main.cc : warning C4172: returning address of local variable or temporary

不太确定GCC的情况,但结果可能是一样的。

票数 8
EN

Stack Overflow用户

发布于 2010-07-09 22:39:10

如果值的大小很小,则const引用不会比值快。在这种情况下,值的类型是long,它是IMO小的(例如4到8个字节):所以const引用不会更快。实际上,它可能要慢一些,因为要获得引用的值,编译器可能需要发出将取消引用的代码(比如取消引用指针)。

考虑到引用是像指针一样实现的(内部),当值的大小大于指针的大小时(假设传递引用是合法的:对超出作用域的局部变量的引用是不合法的),我希望通过传递引用获得更好的性能。

票数 8
EN

Stack Overflow用户

发布于 2010-07-09 22:37:39

在这里,const引用是不正确的--您正在返回对局部变量的引用--这是一个未命名的临时变量,1n * factorial(n - 1)的结果。因为引用是对函数中的局部变量的引用,所以当引用到达调用者时,该局部变量已经超出作用域,并且无效。

返回对大型结构化类型的const引用,当引用在函数退出后存活时,您希望避免复制该引用。通常,这意味着返回对参数或成员变量的引用(在类的情况下)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3216948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档