【问题标题】:Passing const reference parameters whenever possible [duplicate]尽可能传递 const 引用参数[重复]
【发布时间】:2013-01-10 05:57:32
【问题描述】:

可能重复:
C++: How do I decide if to pass params by ref or by value?

以下函数是从C++ Primer, 5th Edition 第 211 页和第 214 页编写的。此函数将返回给定字符在字符串中第一次出现的位置,并告知该字符在该字符串中出现的次数。

string::size_type find_char(const string &s, char c, string::size_type &occurs)
{
      // Compares the given character with string 
      // Records the first occurrence of that character
      // The change in &occurs is reflected back to the original variable
}

作者建议在传递参数时使用“References to Avoid Copies”,对于函数不会更改的参数,建议使用“constreference parameters”。 他们为什么不将char c 设为const 参考参数?

【问题讨论】:

标签: c++ parameters constants pass-by-reference


【解决方案1】:

他们为什么不将char c 设为const 参考参数?

char 非常小,通常通过值而不是通过引用(const 或其他方式)传递它更便宜。

【讨论】:

  • 那么当用户不希望更改字符时,是否应该冒险将字符声明为非const 引用?
  • @ChosenTorture:传递char& 仅在函数希望能够更改调用者看到的值时才有意义。
  • 将字符串作为const 引用并在两者用于相同目的时将其省略为char;这样做仅仅是因为 char 通过价值传递更便宜吗?
  • @ChosenTorture 可以这么说,总是按值传递原始类型是一个既定的约定。通过将conts & 添加到原始类型参数(char、int、double...),您将得到nothing,只有可读性较低的代码。但是你问为什么它是为string 完成的,而不是为char 完成的?我认为这种差异是由类型不同这一事实造成的。 char 是原始的,string不是
  • 附言。 “srting 不是原始的”我的意思是 NOT sizeof(string) 远远超过 sizeof(char) — 问题不在于堆栈使用。通过值传递string 将导致调用其复制构造函数,这将导致为复制此字符串而不必要地分配堆内存,并浪费复制它的时间。如果string"abc",这并不重要,但如果它是一个完整的网页源......你看。如果通过值传递char不会发生这种开销
【解决方案2】:

正如@NPE 所说,char 与所有内置类型一样,可以像指针或引用一样简单地按值传递。

从技术上讲,虽然在创建指针或对内置类型的引用和按值传递方面没有速度差异,但在取消引用该指针或引用以访问底层值时,性能会受到影响。编译器确实有一些可用的优化策略,在涉及引用的情况下,这可能意味着按值传递并不快。但一般来说,您不应该依赖优化器可能会或可能不会做的事情。大多数时候它不会按照你的想法去做。

一般的经验法则是通过值传递内置类型,通过引用(或指针)传递用户定义类型。有些情况会迫使你打破这条规则,但当你遇到它们时你就会知道。

【讨论】:

  • 使字符串成为const 引用并在两者用于相同目的时将其省略为char;这样做仅仅是因为 char 通过价值传递更便宜吗?
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
相关资源
最近更新 更多