【问题标题】:Pass int by const reference or by value , any difference? [duplicate]通过 const 引用或 value 传递 int ,有什么区别吗? [复制]
【发布时间】:2015-05-18 02:25:05
【问题描述】:

当我将 intdouble 这样的原语传递给函数时,是通过 const 引用还是通过值传递它们更好(假设我不更改变量的值)?

int getValueFromArray(int index)
{
    // return the value from the array
}


int getValueFromArray(const int& index)
{
    // return the value from the array
}

谢谢

【问题讨论】:

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


    【解决方案1】:

    对于原始类型,按值传递比按引用传递要好得多。不仅没有间接,而且有了引用,编译器必须担心潜在的别名,这会破坏优化机会。

    最后,按引用传递会导致左值成为 odr-used,这实际上会导致链接器错误。如果调用被内联,最后一个问题不会消失。

    【讨论】:

      【解决方案2】:

      很大程度上取决于编译器的优化级别。编译器优化可能会让整个问题变得毫无意义。实现架构也起到一定的作用。但是,总的来说,按值传递应该稍微好一些。

      它有助于理解引用实际上只是一个指针,顶部有一些糖。因此,检索参数的值涉及从堆栈中取出该指针参数,然后再进行一次取消引用以获取该值,而不是直接从堆栈中读取参数的值。

      但这些差异主要是学术性的。当参数不仅仅是一个 int 值时,这个问题变得更加重要。然后,选择归结为传递引用而不需要进一步的工作,而不是复制参数类的实例。这可能很昂贵。

      【讨论】:

        【解决方案3】:

        如果你通过 const 引用传递 int,你最终会付出一个(不必要的)间接层来访问它的值的代价,除非一个非常聪明的优化器检测到在所有情况下只通过值传递 int 是可以的情况。

        有时通过 (const) 引用传递和 int 是有意义的,但实际上只有当您正在编写模板代码并且不想为像 int 这样的原始数据类型创建额外的特化时。在正常情况下,您最好通过值而不是 const 引用传递 int,尤其是在许多硬件上,当您处理具有类似签名的函数时,可以将 int 传递到寄存器中的函数中你有上面。即使没有,它也可以在堆栈中具有良好的参考位置。

        使用double,情况会有所变化,因为在某些架构上,将指向双精度的引用或指针传递给函数而不是值本身会更有效。但是,在最近的硬件上,与仅传递值相比,由于间接层,您很可能会损失性能。

        在这两种情况下,如果您正在处理代码生成器将处理的较小的实用程序函数,具有相当积极的内联特别是链接时间代码生成的编译器/链接器将能够优化代码以避免任何参数在堆栈上传递内联。

        【讨论】:

          【解决方案4】:

          如果数据类型可以放入处理器的寄存器,则通过副本(值)传递。较大的项目应通过引用传递。

          您应该打印出这两个示例的汇编语言列表,没有优化和高度优化。使用更好的编译器,编译器将识别模式并执行最佳选择,通常按值传递。

          在汇编语言列表中,您可以看到编译器如何执行任何优化。

          没有优化的最坏情况,常量引用通常是通过指针传递来实现的。因此,指针不是在寄存器中,而是在寄存器中。这意味着每当您访问该变量时,您首先要取消引用一个指针。这可能是一些额外的指令或处理器周期,但在执行和程序空间中可能并不重要。

          【讨论】:

            猜你喜欢
            • 2010-11-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多