c++ - 按值传递,常量值,引用,常量引用,指针,常量指针

标签 c++ parameter-passing

探索更多并找到答案以确定如何传入 old post (抱歉重复)

  • 如果函数打算改变参数作为副作用,取 它通过非常量引用。
  • 如果函数不修改它的 参数且参数为原始类型,按值取值。
  • 否则按const引用取,以下情况除外
    • 如果函数需要复制 const 引用 不管怎样,按值(value)来衡量。

[原帖在下方]

我想总结一下按值传递、const值、引用、const引用、指针、const指针的使用,请大家指正和建议。

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

还有一些问题:

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

根据文章"Want Speed? Pass by Value" juanchopanza 提到,我再添加一项。

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

非常感谢!

最佳答案

I seldom see passing by const value. Is it useful or the compiler will detect the const-ness in passing by value?

通过 const 值传递实际上并不存在。当您按值传递时,您不能以这样一种方式修改值,即更改在子例程之外是可见的。这是因为当您按值传递时,会生成原始值的拷贝,并在函数中使用该拷贝。

The const reference takes too much space. Can I just use passing by value? Will the modern compilers optimize it to not sacrifice the performance?

通过 (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
}
// ...

Use const as much as possible.

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

There is no performance difference between passing by reference and pointer.

如果有的话,数量可以忽略不计。编译器会处理这里的细节。它为您节省了创建指针的工作,并且可以很好地为您解除引用。

When the size is not larger than a word, pass by value.

正如 Mark 指出的那样,如果值小于指针,您就可以这样做。指针在 32 位和 64 位系统上的大小不同(因此得名),因此这完全由您自行决定。我喜欢为除了基本类型(charint8_tint16_tfloat 之外的几乎所有内容传递指针> 等),但这只是我的意见。

关于c++ - 按值传递,常量值,引用,常量引用,指针,常量指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14615435/

相关文章:

c++ - 在 C++ 中定义与机器无关的数据类型

python - 合并请求中的冗余参数

java - 调用clickHandler方法并传递值

c++ - 如何设置 Clang-Format Style Options 以在捕获之前不换行?

c++ - 段错误 - C++ 数组

c++ - 如何直接将 double 值转换为 P.Q^-1 modulo MOD,其中 q 与 MOD 互质

R 检查参数是否定义

c# - DLLImport:传递短类型参数

C - fgets 可以接受 NULL 参数吗?

c++ - 文字冒险游戏-如何区分一种元素类型以及如何构造元素类/子类?