use*_*020 5 c++ parameter-passing
探索更多并找到答案以确定如何传递旧帖子(抱歉重复)
[原帖在下面]
我想总结一下按值传递、const 值、引用、const 引用、指针、const 指针的使用,请纠正我并给我您的建议。
还有一些问题:
根据juanchopanza 提到的“Want Speed? Pass by Value”一文,我再添加一项。
非常感谢!
我很少看到传递 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
}
// ...
Run Code Online (Sandbox Code Playgroud)
尽可能使用const。
通过const必要的地方总是一个好主意。它有助于代码的可读性,让其他人知道他们传递给方法的值会发生什么,并帮助编译器捕获您在修改方法内的值时可能犯的任何错误。
通过引用传递和通过指针传递之间没有性能差异。
如果有的话,数量可以忽略不计。编译器将处理这里的细节。它节省了您创建指针的精力,并且可以很好地为您解除引用。
当大小不大于一个字时,按值传递。
正如 Mark 指出的,如果值小于指针,则可以执行此操作。指针在 32 位和 64 位系统上的大小不同(因此得名),因此这实际上由您自行决定。我热衷于为除原始类型(char、int8_t、int16_t、float等)之外的几乎所有内容传递指针,但这只是我的观点。