通常,传递参数值 复制。使用引用可以节省内存,尤其是对于大型结构。但是,在这种情况下:
void foo( int parameter = 7 );
void bar( const int& parameter = 7 );
在第二个声明中,当使用默认值时它究竟会做什么?当常数值用于参考参数时会发生什么?
void foo( const int& parameter ) { }
...
foo( 7 );
当使用某个值时,参考值和复制值之间的效率是否存在差异?
答案 0 :(得分:3)
1)它会做同样的事情,就好像它不是const&
。您无法修改const&
参数,因此您可以将它们绑定到常量 1 。
2)效率可能存在非常微小的差异,因为你真的(可能是依赖于实现的)将指针传递给值而不是值,所以你必须取消引用获得真实价值的指针。 (然后再次,编译器可以看到通过const引用传递int
是浪费时间,所以它将按值传递事物并假装它是由const引用。你无法知道。)这对于较大的构造,牺牲可能是值得的,但通常你不需要通过const引用传递像int
这样的东西。
<小时/> 1 mcmcc指出,在整数文字的情况下,您实际上是将引用绑定到堆栈上的位置(例如,与字符串文字不同,它位于静态内存中)。
答案 1 :(得分:2)
对const的引用是特殊的:它们延长临时对象的生命周期。
比较
struct Foo { Foo(int, int) { } };
{
Foo(1,2); // dies!
const Foo & f = Foo(3,3); // lives...
// ...
} // ... now it's dead
同样,如果不提供整数,则构造临时整数,并且由于绑定到parameter
,其生命周期延长到函数调用的持续时间。
见Herb Sutter的GotW #88。