【问题标题】:Does passing parameter to function as const make copy in memory?将参数传递给 const 函数是否会在内存中复制?
【发布时间】:2017-09-14 10:56:06
【问题描述】:

我有一个简单的问题。这是我的 C++ 代码:

#include <iostream>
using namespace std;

void example(const int someArgument)
{
    cout << someArgument << endl;
}

int main()
{
    int someArgument = -1;
    example(someArgument);
}

运行example(someArgument) 是在内存中复制someArgument,还是只将地址传递给变量?我假设编译器“知道”我不会使用 const 关键字对其进行修改,因此不必进行复制。我错了吗?

【问题讨论】:

  • 这有点像伪代码,忽略它。
  • 参数的constness 不会影响是否复制。它被价值所采用的事实是复制的原因。
  • @MobileDevelopment 不要意外修改值。
  • @MobileDevelopment const 和 const-correct 编程是重要的错误缓解工具,并且在某些情况下有助于编译器优化。当您犯某些容易错过的错误时,它们允许编译器对您大喊大叫。它还有助于为其他程序员或未来的自己生成更具表现力的代码。

标签: c++ pointers memory optimization reference


【解决方案1】:

你是按值传递的,是的,它会复制一个。

如果您不想复制,请通过指针或引用传递参数。不过,在这种情况下,您传递的是一个 int,所以我不必担心按值传递。

我的经验法则是通过值传递原始类型,如果可能的话,通过 const 引用传递所有其他类型。

【讨论】:

  • 我建议不要分享有争议的经验法则,例如作为答案的一部分。
  • 假设我正在传递一个 std::string。这将如何改变游戏?即使使用 -O3 g++ 参数也不会使编译器优化它应该是什么?
  • 这个经验法则并没有真正增加任何东西。这里有一篇非常好的博文:macieira.org/blog/2012/02/the-value-of-passing-by-value
  • 好吧,也许你想提到 int 比 f.e. 上的指针小。 x86 或 AMD64,所以最好将其作为副本传递?
  • @MobileDevelopment 这取决于您对字符串做什么。你要修改它吗?你打算把它储存起来以备后用吗?从您的示例来看,您似乎只是在读取传递的值。如果要通过 const 值传递大对象,通常最好通过 const 引用传递。当您可以自己执行优化而没有明显缺点时,为什么希望编译器执行优化?
【解决方案2】:

关键字 const 并不能告诉您是否复制该变量,您基本上有 3 个选项...

void example(const int someArgument)

void example(const int& someArgument)

void example(const int* someArgument)

您所拥有的是复制您提供的参数并写入 someArgument 变量..

所以 void example(const int someArgument) 你是通过值传递一个整数,所以是一个副本(你不能改变,因为是 const)

【讨论】:

  • 四个选项,因为有右值引用
猜你喜欢
  • 1970-01-01
  • 2012-02-25
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多