探索更多并找到答案以确定如何传入 old post (抱歉重复)
- 如果函数打算改变参数作为副作用,取 它通过非常量引用。
- 如果函数不修改它的 参数且参数为原始类型,按值取值。
- 否则按const引用取,以下情况除外
- 如果函数需要复制 const 引用 不管怎样,按值(value)来衡量。
[原帖在下方]
我想总结一下按值传递、const值、引用、const引用、指针、const指针的使用,请大家指正和建议。
- 对于引用和指针,尽可能使用const(感谢大家)。
- 通过引用和指针传递之间没有性能差异。
- 当大小不大于指针时(感谢 Mark Ransom),按值传递。
还有一些问题:
- 我很少看到传递 const 值。它是否有用,或者编译器会检测到按值传递的常量特性?
- 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 位系统上的大小不同(因此得名),因此这完全由您自行决定。我喜欢为除了基本类型(char
、int8_t
、int16_t
、float
之外的几乎所有内容传递指针> 等),但这只是我的意见。
关于c++ - 按值传递,常量值,引用,常量引用,指针,常量指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14615435/