【问题标题】:Pass by reference more expensive than pass by value引用传递比值传递更昂贵
【发布时间】:2011-01-07 15:53:56
【问题描述】:

在 C++ 中是否存在按引用传递比按值传递更昂贵的情况?如果是这样,那会是什么情况?

【问题讨论】:

    标签: c++ pass-by-reference pass-by-value


    【解决方案1】:

    更喜欢传递原始类型(int、char、float、...)和按值复制(Point、complex)成本低的 POD 结构。

    这将比通过引用传递时所需的间接效率更高。

    Boost's Call Traits

    模板类call_traits<T> 封装了将某种类型T 的参数传递给函数或从函数传递的“最佳”方法,并由下表定义的typedef 集合组成。 call_traits 的目的是确保“引用引用”之类的问题永远不会发生,并且以尽可能最有效的方式传递参数。

    【讨论】:

      【解决方案2】:

      您可以阅读这篇关于复制省略和 RVO(按值优化返回)的文章 "Want speed ? Pass by value"。它解释了引用有时会阻止编译器执行它们。

      【讨论】:

        【解决方案3】:

        是的,访问按引用传递的参数可能需要比按值传递的参数更多的间接级别。此外,如果参数的大小小于单个指针的大小,它可能会更慢。当然,这都是假设编译器没有优化它。

        【讨论】:

        • 那么如何才能知道他的编译器是否在优化呢?
        【解决方案4】:

        如果类型的大小与引用/指针的大小相同或更小,编译器可以优化通过引用传递原始类型而不是简单地传递值。无法保证编译器会这样做,因此如果您有选择,请按值传递原始类型。但是,在模板化代码中,您通常必须通过引用传递 - 考虑向量的 push_back ,它采用 const 引用。如果您有一个整数向量,您将传递对原始类型的引用。在这种情况下,您希望编译器通过将引用替换为值来优化它。由于向量可能存储大型类型,因此接受 const 引用是最佳选择。

        【讨论】:

        • "编译器可以优化..."只要被调用者不修改引用,或者在调用任何可能修改它的代码后读取它。但是,当然,在确实如此的情况下,您希望不会问“哪个更昂贵”,而是“哪个是正确的” :-) 尴尬的是您认为编译器可以优化的情况,但实际上它不能,因为您忽略了某些原因,它必须是参考(别名规则是意外的主要原因)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 2014-09-14
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多