按值、常量值、引用、常量引用、指针、常量指针传递

Passing by value, const value, reference, const reference, pointer, const pointer

本文关键字:常量 指针 引用 按值      更新时间:2023-10-16

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

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

[原文如下]

我想总结一下按值传递、常量值、引用、常量引用、指针

、常量指针的使用,请纠正我并给我您的建议。

  • 至于参考和指针,如果可能的话,请使用 const(谢谢大家)。
  • 通过引用传递和指针传递之间没有性能差异。
  • 当大小不大于指针时(感谢标记赎金),按值传递。

还有一些问题:

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

根据文章"想要速度?按值传递"娟乔潘扎提到,我再加一项。

  • 如果要复制参数,请按值传递它们,并让编译器执行复制,而不是通过 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总是一个好主意。它有助于代码的可读性,让其他人知道他们传递给方法的值会发生什么情况,并帮助编译器捕获在修改方法中的值时可能犯的任何错误。

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

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

当大小不大于单词时,按值传递。

正如 Mark 指出的那样,如果值小于指针,则执行此操作。指针在 32 位和 64 位系统上是不同的大小(因此得名),因此这实际上由您自行决定。我喜欢传递指针,除了原始类型(charint8_tint16_tfloat等),但这只是我的意见。