【问题标题】:Passing vector by constant value vs by constant reference [duplicate]通过常量值与常量引用传递向量[重复]
【发布时间】:2016-10-26 01:12:34
【问题描述】:

我确实理解,一般而言,值传递和引用传递存在显着差异,尤其是对于非平凡类型,主要是对象是否被复制,当我们有右值时有一些警告。

但是,我想知道当传递的参数是常量时,编译器是否真的认识到这两个东西在某种程度上是相同的,并自动优化按值传递以通过引用传递?如果不是,我认为几乎总是通过引用传递参数是标准的,对吧?

【问题讨论】:

    标签: c++ reference parameter-passing


    【解决方案1】:

    不,通常编译器不能用传递引用替换传递值,因为在一般情况下可能会引入别名问题。

    然后参数的值可以在const 下改变,可以这么说:

    void foo( string const a, string& backarai )
    {
        backarai = "Hm! ";
        backarai += a;
    }
    
    void bar( string const& a, string& backarai )
    {
        backarai = "Hm! ";
        backarai += a;
    }
    
    auto main() -> int
    {
        string s = "Well well well!";
        foo( s, s );    // Sets s to "Hm! Well well well!"
    
        string t = "Well well well!";
        bar( t, t );    // Sets t to "Hm! Hm!"
    }
    

    但是,如果在特定情况下编译器可以证明这样的别名不会成为问题,并且复制字符串没有副作用等等,即如果它可以证明两种情况下可观察到的程序行为是相同的,那么它可以这样优化。这就是“好像”规则在起作用。它允许任何优化,其中唯一可观察到的变化是代码的运行时间。

    【讨论】:

    • 我认为当所有参数都是常量时,情况会如此。
    • 是的。但它仍然必须证明这一点,例如复制字符串没有副作用。由于std::string是编译器厂商提供的,所以很有可能,但不知道有没有搞定。
    • 是的,你可能就在那儿。在我的情况下,我正在处理向量,但无论如何都很高兴知道。
    猜你喜欢
    • 2013-09-10
    • 2013-08-01
    • 2011-03-14
    • 2015-03-28
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多