【发布时间】:2011-03-14 02:47:23
【问题描述】:
我试图了解返回 const 引用是否有任何好处。我有一个通常看起来像这样的阶乘函数:
unsigned long factorial(unsigned long n)
{
return (n == 0) ? 1 : n * factorial(n - 1);
}
我假设当我们通过const 引用并返回const 引用时性能会有所提高...但是const-正确性总是让我感到困惑。
const unsigned long & factorial(const unsigned long& n)
{
return (n == 0) ? 1 : n * factorial(n - 1);
}
返回const 引用是否有效?此外,有人可以告诉我:它有益吗?
【问题讨论】:
-
当返回值超出范围(即在函数末尾)时会发生什么?我的猜测是引用指向无效内存。
-
通过 const 引用传递
long不太可能有利于按值传递它。一般来说,这是特定于实现的,但在我能想到的所有架构上,long和long&都将表示为 32 位数量,或者两者都表示为 64 位。因此,您复制了相同数量的数据,但现在调用者必须计算地址(这意味着它还必须有一个本地地址,而不仅仅是保存在寄存器中),而被调用者必须取消引用。充其量,函数会被内联,优化器会删除引用。 -
所以如果我只将返回和输入参数设为 const (没有引用,只有 const 值),我是安全的。
-
你很安全,但它也毫无意义(至少对调用者而言)——因为“顶级”
const完全从函数签名的参数中删除,并且将保留但没有任何区别对于long的返回类型(尽管它可能对类类型有所不同)。 -
@robinjam 我认为这种行为是“未定义的”(参见 en.wikipedia.org/wiki/Undefined_behavior 和 catb.org/jargon/html/N/nasal-demons.html )。使用 MSVC,它将指向现在正用于其他用途的有效(堆栈)内存(或至少,不再为局部变量保留),即内存是可读的,但可能包含一个随机数(或者,可能 偶尔包含一个随机数,具体取决于是否发生中断并用其他内容覆盖内存位置)。
标签: c++ reference pass-by-reference const-correctness