5

探索更多并找到答案以确定如何通过旧帖子(抱歉重复)

  • 如果函数打算将参数更改为副作用,请通过非常量引用获取它。
  • 如果函数不修改其参数并且参数是原始类型,则按值获取。
  • 否则通过 const 引用获取,但以下情况除外
    • 如果该函数无论如何都需要复制 const 引用,请按值获取。

[原帖如下]

我想总结一下按值传递、常量值、引用、常量引用、指针、常量指针的用法,请纠正我并给我你的建议。

  • 至于引用和指针,尽可能使用 const (感谢所有人)。
  • 通过引用传递和指针传递之间没有性能差异。
  • 当大小不大于指针时(感谢 Mark Ransom),按值传递。

还有一些问题:

  1. 我很少看到通过 const 值传递。它有用还是编译器会检测到值传递中的常量性?
  2. const 引用占用了太多空间。我可以只使用按值传递吗?现代编译器会优化它以不牺牲性能吗?

根据 juanchopanza 提到的文章“想要速度?传递价值”,我再添加一项。

  • 如果要复制参数,请按值传递它们并让编译器进行复制,而不是通过 const 引用传递它们并在函数体中自己进行复制。

非常感谢!

4

1 回答 1

4

我很少看到通过 const 值传递。它有用还是编译器会检测到值传递中的常量性?

按值传递const并不存在。当您按值传递时,您不能以使更改在子例程之外可见的方式修改该值。这是因为当您按值传递时,会从原始值制作副本,并且在函数中使用该副本。

const 引用占用了太多空间。我可以只使用按值传递吗?现代编译器会优化它以不牺牲性能吗?

通过 ( const) 引用传递与通过值传递不同。当您通过引用传递值时,不会复制值,只是提供了一个内存位置,因此您可以“修改”(间接)您通过引用传递的值。

例如,以下内容:

void byValue(int x) {
    x += 1
}
void byRef(int &x) {
    x += 1
}

// ...
{
    y = 10;
    byValue(y);
    cout << y << endl // Prints 10
    byRef(y);
    cout << y << endl; // Prints 11
}
// ...

尽可能使用 const。

在必要的地方通过const总是一个好主意。它有助于代码的可读性,让其他人知道他们传递给方法的值会发生什么,并帮助编译器捕捉您在修改方法内的值时可能犯的任何错误。

通过引用传递和指针传递之间没有性能差异。

如果有的话,可以忽略不计。编译器将在这里处理细节。它为您节省了创建指针的工作,并为您很好地取消引用它。

当大小不大于一个字时,按值传递。

正如 Mark 指出的那样,如果值小于指针,则执行此操作。指针在 32 位和 64 位系统上的大小不同(因此得名),因此这完全由您自行决定。char除了原始类型( , int8_t, int16_t, , 等)之外,我喜欢为几乎所有东西传递指针float,但这只是我的观点。

于 2013-01-30T23:07:13.020 回答