【问题标题】:Is it better to pass by value or by reference for basic datatypes? [duplicate]基本数据类型是通过值传递还是通过引用传递更好? [复制]
【发布时间】:2011-05-06 00:04:29
【问题描述】:

可能的重复:
How to pass objects to functions in C++?
is there any specific case where pass-by-value is preferred over pass-by-const-reference in C++?

我有一个这样实现的类的成员:

void aaa(int a, float b, short c)
{
  bbb(a, b);
}

void bbb(int a, float b)
{}

如果 a、b 和 c 的值作为常量存储在我的类中,那么使用如下所示或如上所示的函数会更好/更明智吗?

void aaa(int& a, float& b, short& c)
void bbb(int& a, float& b)

在这种情况下,使用引用是否会给速度带来任何好处或优势?这里引用的任何缺点/开销?

【问题讨论】:

  • 好吧,那些* 是关于什么的?!
  • 我想你需要编辑格式 int**&** 没有意义:-)
  • 星号是由 StackOverflow 添加的。该网站应该将星号之间的字母转换为粗体。将删除它,因为它没有转换。

标签: c++ performance reference


【解决方案1】:

标准对引用的实现没有限制,但是通常它们被实现为自动取消引用的指针(实际上有一些例外)。您可能知道,在 32 位系统上,指针大小为 4 个字节,这意味着通过引用传递 chars、shorts(sizeof() 小于 4 个字节的类型)可能被认为有点矫枉过正——使用 4 个字节而不是 1(char)或 2(短)。 一般来说,这取决于是使用rigisters还是堆栈来传递参数:在通过值传递基本类型时可以节省一点堆栈,但如果是寄存器,即使是字符,也会使用4个字节,所以没有意义尝试使用 ptrs/refs 优化某些东西。

【讨论】:

  • 请注意,在性能上还有另一个区别:当直接使用 int 时,值存在于寄存器或堆栈中,而在传递引用时(假设是自动取消引用的指针)实际值必须使用额外的间接检索,如果按值传递,这将是不必要的。
  • -1 用于传播关于堆栈使用的误解。例如,在堆栈上传递char,通常会在 32 位系统上使用 4 字节的堆栈空间。在 C 和 C++ 中,相同的根本原因反映在自动升级到 int 中。简而言之,小类型的堆栈空间使用与它无关。相反,它与程序员的时间、你需要写多少和需要读多少有关,即程序员的效率,它与可能的额外间接性有关,即程序效率。
  • 呃,这个不正确的答案又是谁投了票?
【解决方案2】:

对于序数类型(即 int、float、bool 等),使用引用而不是简单地使用按值传递并没有节省任何成本。 SourceSource2

【讨论】:

    【解决方案3】:

    如果您使用引用,请将它们设为 const:

    void bbb(const int & a, const float & b);
    

    否则语义将不同于按值传递,因为函数可以更改传递给参数的变量的值。这意味着您不能对参数使用文字。

    【讨论】:

      【解决方案4】:

      我看不出它会更快的原因。在这两种情况下,您都需要将参数发送到函数。如果函数获取的是指针而不是值,那么指针需要解引用,这可能比发送纯值要慢。

      【讨论】:

      • 在指针* 的情况下,将取消引用,在reference & 的情况下,将不涉及“开销”。对于大于用于函数参数的本机寄存器的类型(通常是内存地址的大小),理论上最好通过值传递引用而不是整个对象。
      • @rubenvb:您不需要显式取消引用这一事实并不意味着没有隐式取消引用。在许多(全部?)编译器中,引用被实现为自动取消引用的指针。使用引用意味着在生成的汇编程序中隐含间接(除非函数是内联的——编译器可以使用实际变量)
      • 我想我们正在谈论类似intfloat 的东西。但是,* 和 & 几乎只是指针类型参数的不同语法,所以我猜 David 就在这里。
      • 啊,我认为引用将采用别名变量的内部形式,并避免整个指针取消引用机制。我猜我错了……
      猜你喜欢
      • 2020-04-01
      • 2014-05-28
      • 2016-06-11
      • 2015-02-24
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2017-01-27
      • 2014-05-18
      相关资源
      最近更新 更多