【问题标题】:C++ - constant value for reference parameter?C++ - 参考参数的常量值?
【发布时间】:2012-01-14 04:54:26
【问题描述】:

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

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

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

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

当使用常量值时,参考值和复制值之间的效率有什么不同吗?

【问题讨论】:

    标签: c++ optimization reference constants


    【解决方案1】:

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

    2) 效率上可能存在非常小的差异,因为您实际上(可能取决于实现)传递了指向值而不是值的指针,因此您必须取消引用指向实际值的指针。 (再一次,编译器可以看到通过 const 引用传递 int 是浪费时间,所以它会按值传递事物并假装它是通过 const 引用。你不知道。)这种牺牲可能对于更大的构造来说是值得的,但通常你不需要通过 const 引用传递像 int 这样的东西。


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

    【讨论】:

    • 要清楚,您实际上并没有将其绑定到文字 - 您绑定到堆栈分配的内存位置,该位置恰好包含由文字表示的值。您可以通过 const_cast 对其进行修改,在这种情况下,您正在修改存储在堆栈位置中的值(长期无害,与 Fortran 不同:ibiblio.org/pub/languages/fortran/ch1-8.html#01)。
    • @mcmcc 啊,我不知道。它适用于所有编译器吗?
    • @mcmcc:通过const_cast 改变常量对象是未定义的行为。
    • @Kerrek:没有“常量对象”——有一个文字和一个对临时对象的常量引用。正如 C++11 的移动构造函数所暗示的那样,完全可以修改临时对象。
    【解决方案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

    【讨论】:

    • 我觉得这和他的问题没有关系吧?
    • @SethCarnegie:它回答“使用默认值时它到底会做什么?”我猜我选择了问题中有趣的部分。
    • 我没有看到任何关于使用临时引用的 const 引用。除非7 算作暂时的,但我认为这只是巧合。
    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多