我试图理解返回const引用是否有任何好处。我有一个阶乘函数,通常如下所示:
unsigned long factorial(unsigned long n)
{
return (n == 0) ? 1 : n * factorial(n - 1);
}我假设当我们传递const引用并返回一个const引用时,性能会有提高.但是const-correctness 总是让感到困惑。
const unsigned long & factorial(const unsigned long& n)
{
return (n == 0) ? 1 : n * factorial(n - 1);
}返回const引用有效吗?此外,有谁能告诉我:这是否有益?
发布于 2010-07-09 22:34:45
这是无效的。您不能将引用返回到局部变量。
MSVS C++编译器甚至提供了以下警告:
main.cc : warning C4172: returning address of local variable or temporary不太确定GCC的情况,但结果可能是一样的。
发布于 2010-07-09 22:39:10
如果值的大小很小,则const引用不会比值快。在这种情况下,值的类型是long,它是IMO小的(例如4到8个字节):所以const引用不会更快。实际上,它可能要慢一些,因为要获得引用的值,编译器可能需要发出将取消引用的代码(比如取消引用指针)。
考虑到引用是像指针一样实现的(内部),当值的大小大于指针的大小时(假设传递引用是合法的:对超出作用域的局部变量的引用是不合法的),我希望通过传递引用获得更好的性能。
发布于 2010-07-09 22:37:39
在这里,const引用是不正确的--您正在返回对局部变量的引用--这是一个未命名的临时变量,1或n * factorial(n - 1)的结果。因为引用是对函数中的局部变量的引用,所以当引用到达调用者时,该局部变量已经超出作用域,并且无效。
返回对大型结构化类型的const引用,当引用在函数退出后存活时,您希望避免复制该引用。通常,这意味着返回对参数或成员变量的引用(在类的情况下)。
https://stackoverflow.com/questions/3216948
复制相似问题