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

C++ - constant value for reference parameter?

本文关键字:常数值 参数 参考 C++-      更新时间:2023-10-16

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

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

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

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

当使用contant值时,引用和复制值之间的效率是否有差异?

1)它将做与不是const&相同的事情。不能修改const&参数,所以可以将它们绑定到常量1

2) 效率上可能有一个非常小的差异,因为你真的(可能是依赖于实现的)传递了一个指向值的指针,而不是值,所以你必须取消引用指针才能获得真正的值。(再说一遍,编译器可能会发现通过const引用传递int是浪费时间,所以它会按值传递,并假装它是通过const参考传递的。你不可能知道。)对于更大的构造来说,这种牺牲可能是值得的,但通常你不需要通过const参照传递int这样的东西。


1mcmcc指出,在整数字面值的情况下,您实际上是在将引用绑定到堆栈上的某个位置(例如,与驻留在静态内存中的字符串字面值不同)。

对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。