C ++通过Const引用并通过Const引用返回

时间:2010-07-09 22:29:57

标签: c++ reference pass-by-reference const-correctness

我试图了解返回const引用是否有任何好处。我有一个通常看起来像这样的阶乘函数:

unsigned long factorial(unsigned long n)
{
    return (n == 0) ? 1 : n * factorial(n - 1);
}

我假设当我们通过const引用后会有性能提升,我们会返回const引用...但是const - 正确始终< / strong>让我感到困惑。

const unsigned long & factorial(const unsigned long& n)
{
    return (n == 0) ? 1 : n * factorial(n - 1);
}

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

5 个答案:

答案 0 :(得分:9)

这是无效的。您不能返回对本地变量的引用。

MSVS C ++编译器甚至发出以下警告:

main.cc : warning C4172: returning address of local variable or temporary

对GCC不太确定,但结果可能相同。

答案 1 :(得分:8)

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

鉴于引用是在内部实现的,就像指针一样,当值的大小大于指针的大小时,我希望通过传递引用获得比传递值更好的性能(假设它是均匀的)合法传递引用:对超出范围的局部变量的引用是不合法的。

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

返回const引用有效的唯一情况是,您返回的对象将比函数调用*更长(例如返回调用该函数的类的成员),甚至是上下文,是否应该这样做是不确定的,因为这将允许两个不同的调用者访问相同的内存位置,这使得如果你使用多个线程,修复一个噩梦。

*注意:在您的情况下,您要返回的项目是局部变量,因此不会超过函数调用。因此,您提供的代码是调用恶意的未定义行为。

答案 4 :(得分:1)

可能但我永远不会那样做。为什么呢?

因为这是使代码不可读的好方法。

此外,编译器将优化而不会出现此问题。

此外,您是否还有其他“瓶颈”需要在您的计划中进行优化?
我的意思是,如果你采用这部分代码并在汇编中查看它,你会发现传递函数值并获得结果只是一些操作码。怎么样?
那么,32位整数将适合寄存器。快速为“mov eax,......” 另一方面,您的程序可能有其他可能优化的设计/算法问题......除非它像“hello world”程序一样简单。

所以,开始做这件事不是我要做的事情,欢迎大家挑战我。