C++-参考参数的常数值
C++ - constant value for reference parameter?
通常,参数值在传递时被复制。使用引用可以节省内存,尤其是对于大型结构。然而,在这种情况下:
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。
相关文章:
- C++表达式必须具有常数值
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- C++重载|(按位OR)运算符,返回常数值
- 确定LLVM中的常数值
- 在编译时间之前抓取常数值
- 如何基于用户设置的初始变量设置一组常数值
- C++:在函数内部声明数组时,表达式必须具有常数值
- 常数值可能不一致
- 初始化ctor中的随机常数值
- 使用整数常量0初始化实例,但不使用其他常数值或整数变量
- 从模板参数中指定常数值
- 枚举指针是否可以指向常数值
- C++std用一个常数值列出初始化,它是否会改变性能
- 为什么在C++11中的类型参数包之后不允许使用整数值参数包
- C++-参考参数的常数值
- c++表达式必须有一个常数值
- 如何创建一个std::map的常数值,它仍然可以被[]操作符访问
- c++常数值1j是什么意思?
- 函数值参数的常量特征?
- 表达式在c++中必须有一个常数值错误