C ++ - 参考参数的常量值?

时间:2012-01-14 04:54:27

标签: c++ optimization reference constants

通常,传递参数值 复制。使用引用可以节省内存,尤其是对于大型结构。但是,在这种情况下:

void foo( int parameter = 7 );
void bar( const int& parameter = 7 );

在第二个声明中,当使用默认值时它究竟会做什么?当常数值用于参考参数时会发生什么?

void foo( const int& parameter ) { }
...
foo( 7 );

当使用某个值时,参考值和复制值之间的效率是否存在差异?

2 个答案:

答案 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