如何可以一个左或右值有效地结合相同的参考?

问题描述 投票:6回答:2

假设你有一个使用一个(常量)参数的改变版本的C ++函数。

MyObject alter_obj( MyObject const & obj ); // Creates new, altered object

void func( MyObject const & original ) {
    MyObject const & altered( alter_obj( original ) );
    // ...
}

这正常工作,由于临时的寿命延长,因为“最重要的常量”。这也是相当有效的,如果alter_obj()符合返回值优化的要求,如视网膜静脉阻塞是指返回值改变的对象不是不必要复制。

这也将是有效的,如果你没有作出更改都:

void func( MyObject const & original ) {
    MyObject const & not_altered( original );
    // ...
}

给定对象的其他引用基本上都是免费的,不进行复制的任何性能开销。

但是,说要求改了一下,你要选择是否要作出更改取决于运行条件。天真,我本来期望,使用三元运算符,前面两种方法结合起来将是有效的,直接结合原来的对象可能的情况下,或结合临时如果不。

MyObject alter_obj( MyObject const & obj ); // Creates new, altered object

void func( MyObject const & original ) {
    // ...
    MyObject const & possibly_altered( 
        apply_alteration ? 
        alter_obj( original ) : 
        original 
    );
    // ...
}

但是,看来,这种做法效率不高,因为我本来希望。三元运营商显然需要最后两个参数match on lvalue/rvalue status,不只是对名义类型。这意味着,采取虚假的(没有变化)的分支时,临时右值是通过调用original的MyObject的拷贝构造函数取得。如果为MyObject是不平凡的拷贝,还有由于使这个“伪”拷贝一个潜在的性能损失。

有没有解决这个好办法?是否有可能有效地结合本地引用至其他现有的参考或临时(基于运行时的值选择)不进行额外的副本?

c++ reference ternary-operator rvalue lvalue
2个回答
4
投票

我想创建单独的函数,它接受参考,并调用它,就像这样:

void func( MyObject const & original ) {
    if (apply_alteration)
        func_internal(alter_obj(original));
    else
        func_internal(original);
}

void func_internal( MyObject const & possibly_altered) {
    // ...
}

0
投票

也许添加第二个参数来func()

void func( MyObject const& original, bool modify = false ) {
    if ( modify )  MyObject const & altered( alter_obj( original ) );
    else MyObject const & not_altered( original ); 
}

可能实现你在找什么?

© www.soinside.com 2019 - 2024. All rights reserved.