传值,常量传值,引用,常量引用,指针,常量指针

5

探索更多,找到答案,确定如何在旧帖子中传递参数(对重复的抱歉)

  • 如果函数意图通过副作用改变参数,则使用非const引用。
  • 如果函数不修改其参数且参数为基本类型,则按值传递。
  • 否则,除以下情况外,请按const引用方式传递参数
    • 如果函数需要对const引用进行复制,请按值传递参数。

[原始帖子请见下文]

我想总结一下通过值、const值、引用、const引用、指针、const指针来传递的使用方法,请纠正我并给我建议。

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

还有一些问题:

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

根据juanchopanza提到的文章“要速度?按值传递”,我添加了一个项目。

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

非常感谢!


1
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ - juanchopanza
5
如果值比指针小,就通过值传递。在64位系统上,这个值可能远大于一个字。 - Mark Ransom
6
传递“const value”的意义不大。无论如何都会进行复制,因此调用者的版本无法被修改。 - Carl Norum
4
@CarlNorum:但它可以用于在维护期间捕获错误。如果在函数中修改值是无意义的,但维护人员进行了修改(也许他认为它是引用),那么编译器可以捕获该错误并使维护人员再次查看他们正在做什么。不是毫无意义,但(我倾向于同意您的观点)不太可能有用。 - Martin York
4
为什么有人要关心我在函数内部做什么?我很难理解为什么这样的事情会被禁止。我猜C++在这方面让事情变得更加复杂。 - Carl Norum
1个回答

4
我很少看到通过常量值进行传递。它有用吗?还是编译器将检测传递的常量性? 通过常量值进行传递并不存在。当你通过值传递时,你无法修改该值以使更改在子例程外可见。这是因为当你通过值传递时,会创建原值的副本,而该副本在函数中使用。
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 始终是一个好主意。它有助于代码可读性,让其他人知道他们传递给方法的值将发生什么,并帮助编译器捕捉您在修改方法内部的值时可能犯的任何错误。
按引用和指针传递之间没有性能差异。
如果有,那也是微不足道的。编译器会处理这里的详细信息。它省去了创建指针的麻烦,并且很好地对其进行解引用。
当大小不大于单词时,通过值传递。
正如马克所指出的那样,如果值小于指针,则可以这样做。32位和64位系统上指针的大小不同(因此得名),因此这实际上取决于您自己。我喜欢几乎所有东西都通过指针传递,除了原始类型( char int8_t int16_t float 等),但这只是我的意见。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接