如果在函数中包含const,那么&多余?

时间:2017-07-27 20:58:24

标签: c++

以下两个函数规范是否总是编译成相同的东西?如果您使用const,我无法看到需要副本。如果它们不一样,为什么?

<a href="{% url 'vehicles:detail' pk=vehicles.pk %}">Cancel</a>

3 个答案:

答案 0 :(得分:1)

不一样。如果参数在传递后发生更改(例如,因为它被另一个线程更改),则第一个版本不受影响,因为它具有副本。在第二个变体中,调用的函数可能不会更改参数本身,但它会受到y更改的影响。对于线程,这可能意味着它需要互斥锁。

答案 1 :(得分:0)

没有优化......这是不一样的。

第一行代码获取传递给此函数的值的副本。

第二行代码获取变量的引用,您的函数将始终直接从调用位置变量读取值。

在这两种情况下,编译器都会通知(通过关键字const),这些变量(在函数内)不得修改。如果函数中有任何修改,将生成错误。

答案 2 :(得分:-1)

&指定对象通过引用传递(类似于至少在程序集级别上通过指针传递)。因此

void fval(type x)
{
  // x is a local copy of the data passed by the caller.
  // modifying x has no effect on the data hold by the caller
}
type a;
fval(a);   // a will not be changed

void fref(type &x)
{
  // x is a mere reference to an object
  // changing x affects the data hold by the caller
}
type b;
fref(b);   // b may get changed.

现在添加const关键字只表示该函数承诺不会更改对象。

void fcval(const type x)
{
  // x is a local copy of the data passed by the caller.
  // modifying x is not allowed
}
type a;
fcval(a);  // a will not be changed

void fcref(const type &x)
{
  // x is a mere reference to an object
  // changing x is not allowed
}
type b;
fcref(b);  // b will not be changed

由于副本可能很昂贵,因此如果不需要则应该避免。因此,选择传递常量对象la fcref的方法(fval快速时内置类型除外)。