代码之家  ›  专栏  ›  技术社区  ›  Kiril

C++通过const引用,返回const引用

  •  11
  • Kiril  · 技术社区  · 14 年前

    我在试着弄清楚退票是否有什么好处 const 参考文献。我有一个阶乘函数,通常是这样的:

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

    我想当我们经过时,性能会有所提高 常数 引用并返回 常数 常数 -正确性 总是

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

    退货有效吗 常数 参考号?再者,有人能告诉我:它有益吗?

    5 回复  |  直到 14 年前
        1
  •  8
  •   M. Williams    14 年前

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

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

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

        2
  •  8
  •   ChrisW    14 年前

    long ,它很小(例如,4到8字节):因此常量引用不会更快。事实上,它可能会慢一些,因为要获取引用的值,编译器可能需要发出将取消引用的代码(如取消引用指针)。

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

        3
  •  5
  •   Thanatos    14 年前

    这里的const引用不正确-您正在返回一个对局部变量的引用-这里也是一个未命名的temporary 1 或者是 n * factorial(n - 1) . 因为引用指向函数中的局部变量,所以当引用到达调用方时,该局部变量已经超出范围,并且无效。

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

        4
  •  3
  •   Michael Aaron Safyan    14 年前

    通过const引用返回有效的唯一情况是,如果要返回的对象将比函数调用的时间长*(例如返回调用函数的类的成员),即使在这种情况下,是否应该这样做也是可疑的,因为这将允许两个不同的调用者访问同一个内存位置,如果使用多个线程,这将使问题成为一场噩梦。

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

        5
  •  1
  •   Poni    14 年前

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

    因为这是编写代码的好方法 不可读的 .

    另外,

    另外, 你的程序中没有其他“瓶颈”需要优化吗?
    我的意思是,如果你把代码的这一部分放到汇编中看,你会发现传递函数值并得到结果仅仅是几个操作码。怎么用?
    一个32位的整数可以放在寄存器里。快如“mov eax,…”。
    另一方面,您的程序可能有其他设计/算法问题,可能需要优化。。。除非它像“你好世界”一样简单。

    所以,我不会认真对待这件事,欢迎大家来挑战我。

    推荐文章