以下两个函数规范是否总是编译成相同的东西?如果您使用const,我无法看到需要副本。如果它们不一样,为什么?
<a href="{% url 'vehicles:detail' pk=vehicles.pk %}">Cancel</a>
答案 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
快速时内置类型除外)。